代码之家  ›  专栏  ›  技术社区  ›  Eugene Yokota

C++在Windows上读写BMP文件最简单的方法是什么?

  •  9
  • Eugene Yokota  · 技术社区  · 16 年前

    我想加载一个BMP文件,在内存中做一些操作,并在Windows(Win32原生)上用C++输出一个新的BMP文件。我知道 ImageMagick 它是C++绑定 Magick++ 但我认为这对这个项目来说是一个过度的杀伤力,因为我目前对其他文件格式或平台不感兴趣。

    在代码设置方面,读取和写入BMP文件最简单的方法是什么?答案可能是“使用magick++,这是最简单的。”

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

    7 回复  |  直到 12 年前
        1
  •  7
  •   Gerald    16 年前

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

        2
  •  6
  •   sEver    13 年前

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

        3
  •  5
  •   Chris Becke    16 年前

    BMP文件由3个结构组成。一个BitmapFileHeader,后跟一个BitmapInfo,后跟一个字节数组。

    使用win32加载BMP文件的最简单方法是调用createfile、getfilesize、readfile和closehandle将文件图像加载到内存中,然后将指向缓冲区的指针强制转换为bitmapfileheader,然后从那里开始。

    我撒谎,一个简单的方法是调用loadmimage。确保传递lr_dibsection标志,以确保gdi不会将加载的图像转换为主显示器配置的任何位深度。这有一个优势,让你得到一个hbitmap,你可以选择到一个直流,因此绘制使用GDI。

    但是,要保存它,没有捷径。您需要准备一个bitmapfileheader,写出它,填充一个bitmapinfo结构,写出它,然后写出实际的像素数据。

        4
  •  2
  •   Mr Fooz    16 年前

    这个 CBitmap 类执行BMP I/O。

        5
  •  2
  •   Eugene Yokota    16 年前
    #include <windows.h>
    

    LoadImage

        6
  •  1
  •   Daniel Vassallo    16 年前

    我没有使用magick++,但Windows有一个名为Windows图像组件的库,它很可能适合您的需要。

        7
  •  1
  •   Mike C Chris Taylor    12 年前

    我试过 CImage 如上所述,但我有一个充满像素值的C数组,我只是想将其作为BMP(或任何其他格式)转储。 图像 没有构造函数,我不想链接 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");
    }