由HBITMAP保存为图片
发布日期:2021-10-20 09:40:01 浏览次数:19 分类:技术文章

本文共 3665 字,大约阅读时间需要 12 分钟。

原文地址:

//VC下把HBITMAP保存为bmp图片 BOOL  SaveBmp(HBITMAP     hBitmap,   CString     FileName)       {       	HDC     hDC;       	//当前分辨率下每象素所占字节数       	int     iBits;       	//位图中每象素所占字节数       	WORD     wBitCount;       	//定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数           	DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;           	//位图属性结构           	BITMAP     Bitmap;               	//位图文件头结构       	BITMAPFILEHEADER     bmfHdr;               	//位图信息头结构           	BITMAPINFOHEADER     bi;               	//指向位图信息头结构               	LPBITMAPINFOHEADER     lpbi;               	//定义文件,分配内存句柄,调色板句柄           	HANDLE     fh,   hDib,   hPal,hOldPal=NULL;           	//计算位图文件每个像素所占字节数           	hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);       	iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);           	DeleteDC(hDC);           	if(iBits <=  1)                                                 		wBitCount = 1;           	else  if(iBits <=  4)                             		wBitCount  = 4;           	else if(iBits <=  8)                             		wBitCount  = 8;           	else                                                                                                                             		wBitCount  = 24;           	GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);       	bi.biSize= sizeof(BITMAPINFOHEADER);       	bi.biWidth = Bitmap.bmWidth;       	bi.biHeight =  Bitmap.bmHeight;       	bi.biPlanes =  1;       	bi.biBitCount = wBitCount;       	bi.biCompression= BI_RGB;       	bi.biSizeImage=0;       	bi.biXPelsPerMeter = 0;       	bi.biYPelsPerMeter = 0;       	bi.biClrImportant = 0;       	bi.biClrUsed =  0;       	dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;       	//为位图内容分配内存           	hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));           	lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);           	*lpbi  = bi;           	//     处理调色板               	hPal  = GetStockObject(DEFAULT_PALETTE);           	if (hPal)           	{           		hDC  = ::GetDC(NULL);           		hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);           		RealizePalette(hDC);           	}       	//     获取该调色板下新的像素值           	GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,		(LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize, 		(BITMAPINFO *)lpbi, DIB_RGB_COLORS);           	//恢复调色板               	if (hOldPal)           	{           		::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);           		RealizePalette(hDC);           		::ReleaseDC(NULL,   hDC);           	}           	//创建位图文件               	fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,         		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);           	if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;           	//     设置位图文件头           	bmfHdr.bfType  = 0x4D42;     //     "BM"           	dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;               	bmfHdr.bfSize  = dwDIBSize;           	bmfHdr.bfReserved1  = 0;           	bmfHdr.bfReserved2  = 0;           	bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;           	//     写入位图文件头           	WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);           	//     写入位图文件其余内容           	WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);           	//清除               	GlobalUnlock(hDib);           	GlobalFree(hDib);           	CloseHandle(fh);           	return     TRUE;       }

转载地址:https://blog.csdn.net/up2wing/article/details/12789803 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:神经网络小结
下一篇:spice server主表面(primary surface)创建过程

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月24日 15时46分25秒