在 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控件加载一张位图,然后在位图上画一条线,该怎么做

从数字数组创建 8 位位图

C++如何把位图保存到数组中

如何在 MFC 的 CListCtrl 中插入位图或其他图像对象?

使用 savefiledialog 保存图像时出现问题

带位图和文本的 MFC 按钮