C ++:在Windows上使用C ++读取和写入BMP文件最简单的方法是什么?

我想加载一个BMP文件,在内存中执行一些操作,并在Windows(Win32 native)上使用C ++输出一个新的BMP文件。 我知道ImageMagick和它的C ++绑定Magick ++ ,但我认为这是一个矫枉过正的项目,因为我目前对其他文件格式或平台不感兴趣。

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

相关问题: 什么是最好的image processing库?

在为Windows开发时,通常只使用ATL CImage类

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

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

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

我说谎,更简单的方法是调用LoadImage。 确保传递LR_DIBSECTION标志,以确保GDI不会将加载的图像转换为您的主显示器所配置的任何bitdepth。 这有一个你可以选择到DC的HBITMAP的优点,因此可以使用GDI进行全面绘制。

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

CBitmap类是BMP I / O。

#include <windows.h> 

的LoadImage

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

我如上所述尝试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"); }