首页 新闻 赞助 找找看

跪求-MFC保存BMP图像问题?

0
悬赏园豆:15 [已关闭问题] 关闭于 2017-10-22 20:38

是这样的,我在写一个程序,想要达成的效果是:对打开图像绘制的线条等等,在保存图像时会同样保存,即可以保存对图像文件进行的处理,例如在上面绘图等等。

当前程序可以打开图像文件,也有保存图像文件的代码,但是保存图像时,在程序中对图像上绘制的线条等,却不会得到保存。

在网上找的保存图像的代码如下:

BOOL SaveBitmapToFile(HBITMAP hBitmap, LPCTSTR lpFileName ) 
{ 
HDC hDC; //设备描述表 
int iBits; //当前显示分辨率下每个像素所占字节数 
WORD wBitCount; //位图中每个像素所占字节数 
DWORD dwPaletteSize=0, //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
dwBmBitsSize, 
dwDIBSize, dwWritten; 
BITMAP Bitmap; //位图属性结构 
BITMAPFILEHEADER bmfHdr; //位图文件头结构 
BITMAPINFOHEADER bi; //位图信息头结构 
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 

HANDLE fh, hDib, hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄 

//计算位图文件每个像素所占字节数 
HDC hWndDC = CreateDC("DISPLAY",NULL,NULL,NULL); 
hDC = ::CreateCompatibleDC( hWndDC ) ; 
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 if (iBits <= 24) 
wBitCount = 24; 
else 
wBitCount = 24 ; 

//计算调色板大小 
if (wBitCount <= 8) 
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD); 

//设置位图信息头结构 
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.biClrUsed = 0; 
bi.biClrImportant = 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, 
(LPBITMAPINFO ) 
lpbi, DIB_RGB_COLORS); 

//恢复调色板 
if (hOldPal) 
{ 
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
RealizePalette(hDC); 
::ReleaseDC(NULL, hDC); 
} 

//创建位图文件 
fh = CreateFile(lpFileName, 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; 

} 

 

但是应该用什么方式才可以保存在图像上绘制的图形,只说明BMP格式也可。

这里的大神不少,希望能解答下我的问题。

给出多种方式也可,我不嫌多。

博雅源的主页 博雅源 | 初学一级 | 园豆:178
提问于:2015-12-15 22:11
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册