2008-10-13 36 views
9

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

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

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

回答

7

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

+0

我想的CImage是共享MFC/ATL类的一部分 - 这可能是更容易一点,然后以包含的CBitmap类,它需要MFC。 – Aardvark 2008-10-13 23:34:38

+1

是的,你只需要包含atlimage.h – Gerald 2008-10-14 00:01:33

+0

如果你不是只针对Windows,那该怎么办? – JohnIdol 2008-12-08 13:24:49

1

我没有用Magick ++,但Windows有一个名为Windows图像处理组件,其很可能会满足您的需求库。

5

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

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

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

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

6

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

1

我试过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"); 
} 
相关问题