【问题标题】:C++: What's the simplest way to read and write BMP files using C++ on Windows?C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是什么?
【发布时间】:2012-12-14 01:18:12
【问题描述】:

我想加载一个 BMP 文件,在内存中对其进行一些操作,然后在 Windows(Win32 原生)上使用 C++ 输出一个新的 BMP 文件。我知道 ImageMagick 和它是 C++ 绑定 Magick++,但我认为这对这个项目来说有点过头了,因为我目前对其他文件格式或平台不感兴趣。

就读取和写入 BMP 文件的代码设置而言,最简单的方法是什么?答案可能是“只需使用 Magick++,它是最简单的。”

相关问题:What is the best image manipulation library?

【问题讨论】:

  • 相关问题已被审核删除。

标签: c++ windows winapi image-manipulation bmp


【解决方案1】:

当只为 Windows 开发时,我通常只使用 ATL CImage

【讨论】:

  • 我认为 CImage 是共享 MFC/ATL 类的一部分 - 与需要 MFC 的 CBitmap 类相比,它可能更容易包含。
  • 是的,你只需要包含 atlimage.h
  • 如果您不只针对 Windows 怎么办?
  • 我有一个自定义位图类,我在为其他平台开发应用程序或需要更多灵活性的地方使用它。 BMP 格式比较简单。如果您需要跨平台的东西,在 SourceForge 上还有一个名为 EasyBMP 的开源库(BSD 许可)。
【解决方案2】:

EasyBMP 如果你只想要 bmp 支持。我很简单,可以在几分钟内开始使用,如果你需要的话,它是多平台的。

【讨论】:

    【解决方案3】:

    一个 BMP 文件由 3 个结构组成。一个 BITMAPFILEHEADER 后跟一个 BITMAPINFO 后跟一个字节数组。

    使用 Win32 加载 BMP 文件最简单的方法是调用 CreateFile、GetFileSize、ReadFile 和 CloseHandle 将文件图像加载到内存中,然后将指向缓冲区的指针转换为 BITMAPFILEHEADER 并从那里开始。

    我撒谎,更简单的方法是调用LoadImage。确保传递 LR_DIBSECTION 标志以确保 GDI 不会将加载的图像转换为您的主显示器配置的任何位深度。这样做的好处是为您提供了一个 HBITMAP,您可以将其选择到 DC 中,从而使用 GDI 进行绘制。

    然而,要保存它,没有捷径可走。你需要准备一个 BITMAPFILEHEADER,写出来,填写一个 BITMAPINFO 结构,写出来,然后是实际的像素数据。

    【讨论】:

      【解决方案4】:

      我如上所述尝试了CImage,但我有一个充满像素值的 C 数组,我只是想将其转储为 BMP(或任何其他格式)。 CImage 没有构造函数,我不想链接 MFC(用于 CBitmap)也不想尝试理解 IWIC。

      简单的是CImg

      #include <cimg/cimg.h>
      using namespace cimg_library;
      //...
      void SaveMyData(uint8_t *pxarray, int width, int height)
      {
          CImg<uint8_t> img(pxarray, width, height);
          img.save_bmp("sav.bmp");
      }
      

      【讨论】:

      • 我应该提一下:我认为我不会在产品中使用 CImg。我不喜欢单片头,也不喜欢它会引发很多警告。
      【解决方案5】:

      CBitmap 类执行 BMP I/O。

      【讨论】:

        【解决方案6】:
        #include <windows.h>
        

        LoadImage

        【讨论】:

        • 哦不,我的意思是包含(尖锐)“windows.h”,但我的部分评论丢失了
        【解决方案7】:

        我没有使用 Magick++,但 Windows 有一个名为 Windows Imaging Component 的库,它可能会满足您的需求。

        【讨论】:

          猜你喜欢
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-23
          • 2013-07-06
          • 2012-09-30
          • 1970-01-01
          相关资源
          最近更新 更多