在 MFC 中保存位图时出错
Posted
技术标签:
【中文标题】在 MFC 中保存位图时出错【英文标题】:Error while saving a bitmap in MFC 【发布时间】:2014-01-17 10:35:59 【问题描述】:我在我的 MFC 应用程序中显示一个图像,我想将它保存为位图。 这是我的代码。
BITMAPFILEHEADER bh;
ZeroMemory(&bh, sizeof(BITMAPFILEHEADER));
bh.bfType = 0x4d42; //bitmap
bh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bh.bfSize = bh.bfOffBits + ((IM_WIDTH*IM_HEIGHT*2)*3);
CFile file;
if(file.Open("Image1.bmp", CFile::modeCreate | CFile::modeWrite))
file.Write(&bh, sizeof(BITMAPFILEHEADER));
file.Write(&(bmi.bmiHeader), sizeof(BITMAPINFOHEADER));
file.Write(im_final, 3 * IM_WIDTH * IM_HEIGHT*2);
file.Close();
我正在使用与显示图像相同的 BITMAPINFOHEADER。 但是保存的图像不正确。 请告诉我我做错了什么。
【问题讨论】:
见 msdn.microsoft.com/en-us/library/windows/desktop/dd183391.aspx 和 en.wikipedia.org/wiki/BMP_file_format 。BITMAPINFOHEADER
后面应该有一定的附加信息在实际像素数据之前;此附加信息的确切形式取决于BITMAPINFOHEADER
中指定的位图格式。此外,每条扫描线都应填充到 4 字节边界。如果IM_WIDTH
不是 4 的倍数,那么您的数据大小计算是错误的。顺便问一下,为什么要乘以 2? *3
可能是因为你有 24bpp 位图,但为什么要多一个 *2
?
额外 2 是因为我正在放大我的图像,所以我必须加倍高度。谢谢回复。我将查看标题信息。我的图像宽度是 4 的倍数,所以这不是问题。
嘿,非常感谢 :) 标题信息为我做了。我包含了有关 RGBQUAD 的信息,它现在可以工作了。
【参考方案1】:
这是我现在使用的代码,效果很好:
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42; /* "BM" */
bmfh.bfSize = (sizeof(BITMAPFILEHEADER) + bmih.biSize + bmih.biClrUsed * sizeof(RGBQUAD) + bmih.biSizeImage);
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + bmih.biSize + bmih.biClrUsed * sizeof(RGBQUAD);
CString file = m_filepath;
char* savefile = file.GetBuffer();
hFile = CreateFile(savefile, GENERIC_WRITE, 0, (LPSECURITY_ATTRIBUTES) NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
if (hFile != INVALID_HANDLE_VALUE)
WriteFile(hFile, (char *) &bmfh, sizeof(BITMAPFILEHEADER), (LPDWORD) &err, NULL);
WriteFile(hFile, (char *) &bmih, sizeof(BITMAPINFOHEADER), (LPDWORD) &err, NULL);
WriteFile(hFile, (char *) &bmi.bmiColors, sizeof(bmi.bmiColors), (LPDWORD) &err, NULL);
WriteFile(hFile, im_rgb, bmih.biSizeImage, (LPDWORD) &err, NULL);
CloseHandle(hFile);
【讨论】:
以上是关于在 MFC 中保存位图时出错的主要内容,如果未能解决你的问题,请参考以下文章
mfc里给picture控件加载一张位图,然后在位图上画一条线,该怎么做