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

11
我想在Windows上使用C++加载BMP文件,在内存中对其进行一些操作,然后输出一个新的BMP文件。我知道ImageMagick及其C++绑定Magick++,但我认为这对于我的项目来说有点过度了,因为我目前不关心其他文件格式或平台。
在代码设置方面,读取和写入BMP文件的最简单方法是什么?答案可能是“只需使用Magick++即可,它是最简单的。”
相关问题:什么是最好的图像处理库?

相关问题已被管理员删除。 - Technophile
7个回答

8

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


我认为CImage是共享MFC/ATL类的一部分 - 这可能比需要MFC的CBitmap类更容易包含。 - Aardvark
1
是的,你只需要包含atlimage.h。 - Gerald
1
如果你不仅仅针对Windows系统呢? - JohnIdol
1
我有一个自定义的位图类,当我开发其他平台的应用或者需要更多的灵活性时使用它。BMP格式相对简单。如果你需要跨平台的东西,还有一个名为EasyBMP的开源库(BSD许可证),可以在SourceForge上找到。 - Gerald

6

EasyBMP 是一个只支持 bmp 格式的库。它非常简单易用,几分钟内就能上手,并且支持多个平台。


5
一个BMP文件由3个结构组成。BITMAPFILEHEADER紧随其后是BITMAPINFO,然后是一系列字节。
在Win32中加载BMP文件的绝对最简单的方法是调用CreateFile、GetFileSize、ReadFile和CloseHandle将文件图像加载到内存中,然后只需将指向缓冲区的指针转换为BITMAPFILEHEADER并从那里开始操作。
我撒谎了,更简单的方法是调用LoadImage。确保传递LR_DIBSECTION标志以确保GDI不会将加载的图像转换为主显示器配置的任何位深度。这样可以让您获得一个HBITMAP,您可以将其选择到DC中,因此使用GDI可以随意绘制。
但是要保存它,就没有捷径。您需要准备一个BITMAPFILEHEADER,将其写出,填充BITMAPINFO结构,将其写出,然后是实际的像素数据。

3
我尝试了上述的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。我不喜欢它的单片头文件,也不喜欢它抛出很多警告。 - Mike C

2

CBitmap类可进行BMP I/O操作。


2

1
我没有使用过Magick++,但Windows有一个叫做Windows Imaging Component的库,可能适合您的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接