11

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

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

相关问题:最好的图像处理库是什么?

4

7 回答 7

8

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

于 2008-10-13T23:31:32.440 回答
6

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

于 2011-08-16T12:29:25.117 回答
5

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

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

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

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

于 2008-10-14T07:30:01.287 回答
3

我按照上面的方法进行了尝试CImage,但是我有一个 C 数组,其中包含我只是想将其转储为 BMP(或任何其他格式)的像素值。 CImage没有构造函数,我不想链接 MFC (for 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");
}
于 2012-08-14T22:36:39.687 回答
2

CBitmap类执行BMP I/O。

于 2008-10-13T23:28:26.597 回答
2
#include <windows.h>

加载图像

于 2008-10-14T05:47:47.827 回答
1

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

于 2008-10-13T23:25:57.693 回答