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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值