`

VC图像处理

    博客分类:
  • VC++
阅读更多
 保存文件
void SaveFile(char* name,MYBITMAP* m){

	CFile file(name,CFile::modeWrite|CFile::modeCreate);
	file.Write(m->bmphdr,sizeof(BITMAPFILEHEADER));
	file.Write(m->lpbmp,sizeof(BITMAPINFOHEADER));
	file.WriteHuge(m->palette,m->len);
	file.WriteHuge(m->data,WIDTHBYTES(m->lpbmp->biWidth*8)*m->lpbmp->biHeight);
	file.Close();
}
 灰度化
BOOL Gray(MYBITMAP* &myb){
BITMAPFILEHEADER *bfh=(myb->bmphdr); BITMAPINFOHEADER *bih=(myb->lpbmp); int lw=WIDTHBYTES(bih->biWidth*8); int lh=bih->biHeight; bfh->bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+lw*bih->biHeight+256*4; bfh->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*4; bih->biBitCount=8; bih->biClrUsed=256; bih->biClrImportant=0; bih->biSizeImage=lw*lh; //创建调色板 BYTE * pal = new BYTE[256*4]; memset(pal,0,256*4); for(int i=0;i<256;i++){ pal[i*4]=i; pal[i*4+1]=i; pal[i*4+2]=i; } if(myb->palette!=NULL){ delete myb->palette; } myb->palette=pal; myb->len=256*4; //修改数据 LPBYTE data = new BYTE[lw*lh]; for(int j=0;j<lh;j++){ for(int k=0;k<bih->biWidth;k++){ double r=myb->data[(j*bih->biWidth+k)*3]; double g=myb->data[(j*bih->biWidth+k)*3+1]; double b=myb->data[(j*bih->biWidth+k)*3+2]; data[j*bih->biWidth+k]=0.3*r+0.59*g+0.11*b; } } delete myb->data; myb->data=data; return 0; } //自定义位图格式 typedef struct mybitmay{ BITMAPFILEHEADER *bmphdr;//文件头 BITMAPINFOHEADER *lpbmp;//文件信息头] LPBYTE palette;//调色板 int len;//调色板长度 LPBYTE data;//文件数据 }MYBITMAP;

 

MYBITMAP *AttachFromName(LPCTSTR lpcPathName);//打开图片文件
MYBITMAP *AttachFromFile(CFile &file);//得到位图信息
#endif

BOOL Gray(MYBITMAP* &myb);//灰度化
BOOL 	 PaintDIB(HDC  hDC,RECT des,RECT src, MYBITMAP    myb);//在屏幕上画图

void SaveFile(char* name,MYBITMAP* m);
HPALETTE GetPalette(MYBITMAP* m);

 

MYBITMAP *AttachFromName(LPCTSTR lpcPathName)//打开文件
{
	CFile file;
	if(!file.Open(lpcPathName,CFile::modeRead))
		return 0;
	return AttachFromFile(file);
}

MYBITMAP *AttachFromFile(CFile &file)//得到图片信息
{
	LPBYTE lpData;
	BITMAPINFOHEADER *pBMIH;
	LPVOID lpvColorTable;
	int nColorTableEntries;
	BITMAPFILEHEADER  *bmfHeader=(BITMAPFILEHEADER*)malloc(sizeof( BITMAPFILEHEADER));
	if(!file.Read(bmfHeader,sizeof(BITMAPFILEHEADER)))
	{
		return FALSE;
	}
	if(bmfHeader->bfType!=MAKEWORD('B','M'))
	{
		return FALSE;
	}
	pBMIH=(BITMAPINFOHEADER*)malloc(bmfHeader->bfOffBits-sizeof(BITMAPFILEHEADER));
	if(!file.Read(pBMIH,bmfHeader->bfOffBits-sizeof(BITMAPFILEHEADER)))//文件信息头
	{
		delete pBMIH;
		return FALSE;
	}
	nColorTableEntries=(bmfHeader->bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER))/sizeof(RGBQUAD);
	if(nColorTableEntries>0)
	{
		lpvColorTable=pBMIH+1;
	}
	int nWidthBytes=WIDTHBYTES((pBMIH->biWidth)*pBMIH->biBitCount);
	lpData=new BYTE[pBMIH->biHeight*nWidthBytes*3];
	printf("nWidthBytes:%d,biWidth:%d\n",nWidthBytes,pBMIH->biWidth);

		file.ReadHuge(lpData,pBMIH->biHeight*nWidthBytes*3);

	MYBITMAP *m = new MYBITMAP;
	m->bmphdr=bmfHeader;
	m->lpbmp=pBMIH;
	if(pBMIH->biClrUsed==0){
		m->palette=0;
		m->len=0;
	}
	m->data=lpData;
	return m;
}

 显示在程序上

BOOL 	 PaintDIB(HDC  hDC,RECT des,RECT src, MYBITMAP    myb){
	
	BITMAPINFOHEADER*    lpDIBHdr;            // BITMAPINFOHEADER指针
	BOOL     bSuccess=FALSE;      // 成功标志
	HPALETTE hPal=NULL;           // DIB调色板
	HPALETTE hOldPal=NULL;        // 以前的调色板
	lpDIBHdr  = myb.lpbmp;	

	int lw=WIDTHBYTES(myb.lpbmp->biWidth*8);
	hPal=GetPalette(&myb);
	if (hPal != NULL)
	{	
		// 选中调色板
		hOldPal = ::SelectPalette(hDC, hPal, FALSE);
	}
	
	// 设置显示模式
	::SetStretchBltMode(hDC, COLORONCOLOR);
	int  bw =myb.lpbmp->biWidth;
	int  bh = myb.lpbmp->biHeight;
	
	// 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
	if(des.right-des.left>=(src.right-src.left)&&
		(des.bottom-des.top)>=(src.bottom-src.top)
		)
	{
		// 原始大小,不用拉伸。
		bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
			0  ,        // DestX
			0 ,            // DestY
			bw   ,     // nDestWidth
			bh,       // nDestHeight
			0,            // SrcX
			0,   // SrcY
			0,                         // nStartScan
			bh,  // nNumScans
			myb.data,                  // lpBits
			(LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
			DIB_RGB_COLORS
			);            // wUsage
		
	}
	
	else
	{
		// 非原始大小,拉伸。
		bSuccess = StretchDIBits(hDC,                    // hDC
			des.left  ,        // DestX
			des.top ,            // DestY
			des.right   ,     // nDestWidth
			des.bottom,       // nDestHeight
			src.left,            // SrcX
			src.top,   // SrcY
			src.right,                         // nStartScan
			src.bottom,  // nNumScans
			myb.data,                  // lpBits
			(LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
			DIB_RGB_COLORS,
			SRCCOPY
			);            // wUsage
	}
	
    // 解除锁定
	
	// 恢复以前的调色板
	if (hOldPal != NULL)
	{
		::SelectPalette(hDC, hOldPal, TRUE);
	}
	
	// 返回
	return bSuccess;
}

 

 

 

//调色板设置
HPALETTE GetPalette(MYBITMAP* m){
	HPALETTE hPal=0;
	if(m->len!=0){
		LOGPALETTE *lpLogPalette=(LOGPALETTE*)new BYTE[sizeof(LOGPALETTE)+255*sizeof(PALETTEENTRY)];
		
		lpLogPalette->palVersion=0x300;
		lpLogPalette->palNumEntries=256;
		//	lpLogPalette->palPalEntry =new PALETTEENTRY[256];
		for(int i=0;i<256;i++){
			PALETTEENTRY entry={i,i,i,0};
			lpLogPalette->palPalEntry[i]=entry;
			
		}
		//memcpy(a+4,myb.palette,256*4);
		hPal=CreatePalette(lpLogPalette);
		delete lpLogPalette;
		
	}
	return hPal;
}

 

 

这里有Jpg与bmp之转换的dll

分享到:
评论

相关推荐

    VC图像处理编程入门

    VC图像处理编程入门的知识点涵盖如何在Visual C++环境(VC6.0)中开发数字图像处理程序。具体来说,涉及以下几个方面: 1. 程序框架建立 - 学会创建应用程序:了解如何在VisualC++6.0中新建应用程序,并设置工程...

    VC图像处理代码

    【VC图像处理代码】是一个与计算机视觉相关的资源,主要涉及图像处理的核心算法,特别是特征点的寻找和匹配。在这个项目中,开发者可能使用了Visual C++(VC)作为编程环境,因为“VC”通常指的是微软的Visual C++,...

    VC图像处理例程

    本压缩包中的"VC图像处理例程"是一组使用VC6.0编写的源代码,它为我们提供了一个了解和学习图像处理技术的实践平台。以下将对这个主题进行详细的探讨。 1. **VC6.0**:VC6.0是Microsoft Visual Studio的一个早期...

    VC图像处理系列之二_图像显示篇

    ### VC图像处理系列之二_图像显示篇 #### 一、相关术语 在深入探讨图像显示之前,我们先了解一些图像处理中常见的专业术语。 **像素(Pixel)**:像素是构成数字图像的基本单位,是图像中最基本的采样单元。例如...

    vc图像处理源码(比较全面)

    总的来说,"vc图像处理源码(比较全面)"提供了一个学习和实践图像处理的好机会。无论是对于初学者还是经验丰富的开发者,都能从中获取宝贵的知识,加深对图像处理原理的理解,并提升编程技能。通过研究和调试这些...

    VC图像处理demo

    **VC图像处理Demo详解** 本篇将深入探讨“VC图像处理Demo”,这是一个使用Microsoft Visual C++(VC)编写的图像处理程序示例。虽然它在处理特定图片对象格式上存在限制,但该Demo仍提供了丰富的基础图像处理功能,...

    VC图像处理常用代码

    本压缩包“VC图像处理常用代码”包含了多个关键的图像处理算法,这些算法在实际应用中具有重要的价值。下面将详细介绍其中涉及到的知识点。 1. 反色: 反色操作是图像处理中最基础的操作之一,它通过取像素值的补码...

    VC图像处理代码之—数字图像工程案例.

    这个"VC图像处理代码之—数字图像工程案例"集合提供了丰富的实践示例,可以帮助我们深入理解数字图像处理的基本原理和应用。在这个压缩包中,我们可以期待找到一系列基于VC++的图像处理程序,它们涵盖了各种算法和...

    VC图像处理实现多功能

    本项目“VC图像处理实现多功能”是一个利用VC++实现的图像处理程序,包含了多种图像处理技术,如二值化、锐化、平滑以及形态学操作等,旨在为开发者和研究人员提供一个功能丰富的工具集。 首先,**二值化**是图像...

    VC 图像处理谢鸣凤代码

    "VC 图像处理谢鸣凤代码"是一个专门针对图像处理的代码集合,由谢鸣凤编写,涵盖了多个核心的图像处理技术。这个资源对于学习和实践VC++中的图像处理技术具有很高的价值。 首先,我们要了解图像处理的基本概念。...

    CDib.rar_CDib_CDib visual_VC 图像处理_vc++_vc图像处理

    在本文中,我们将深入探讨与"CDib.rar_CDib_CDib visual_VC 图像处理_vc++_vc图像处理"相关的主题,这是一个与Visual C++(VC++)图像处理相关的类库,特别适合那些需要在VC++环境中进行图像操作的开发者。...

    全套VC图像处理源代码

    《VC++图像处理源代码深度解析》 在计算机科学领域,图像处理是一项至关重要的技术,广泛应用于医学影像、遥感、视频分析、图形用户界面等多个领域。本篇将深入探讨基于VC++(Visual C++)的图像处理源代码,帮助...

    vc图像处理程序与原理

    在本文中,我们将深入探讨“vc图像处理程序与原理”,主要关注如何在Microsoft Visual C++ (VC++)环境中利用MFC库进行交通标志图像处理。MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,它使得开发者...

    VC图像处理系列之6--界面设计及总结篇

    在本篇“VC图像处理系列之6--界面设计及总结篇”中,我们将探讨如何在Visual C++(VC)环境中创建一个图像处理程序的用户界面,并对整个图像处理系列进行回顾与总结。虽然这个程序可能没有包含所有高级的图像处理...

    VC图像处理与 图像理解

    总之,"VC图像处理与图像理解"是一个宝贵的资源,它不仅涵盖了图像处理的各个方面,还涉及了图像理解的前沿技术。通过学习和实践,开发者不仅可以提升编程技能,还能增强对视觉信息处理的理论理解,为未来的AI项目...

    VC图像处理 锐化及边缘检测

    通过实际操作和实践,你将能够熟练地在VC中实现图像的锐化和边缘检测,为后续更复杂的图像处理任务打下坚实的基础。 总的来说,图像处理中的锐化和边缘检测是基础但至关重要的技术,它们在很多领域都有着广泛的应用...

    vc图像处理教程

    本教程基于刘涛的VC图像处理讲座,旨在帮助开发者掌握如何在Visual C++中打开、显示和保存图像文件。这个教程修复了之前版本的一些问题,确保了代码的正确性和稳定性。 首先,我们要理解VC++中的图像处理涉及到的...

Global site tag (gtag.js) - Google Analytics