我想加载一个 BMP 文件,在内存中对其进行一些操作,并在 Windows 上使用 C++(Win32 本机)输出一个新的 BMP 文件。我知道ImageMagick并且它是 C++ 绑定Magick++,但我认为这对这个项目来说有点过头了,因为我目前对其他文件格式或平台不感兴趣。
就读取和写入 BMP 文件的代码设置而言,最简单的方法是什么?答案可能是“只使用 Magick++,它是最简单的”。
相关问题:最好的图像处理库是什么?
我想加载一个 BMP 文件,在内存中对其进行一些操作,并在 Windows 上使用 C++(Win32 本机)输出一个新的 BMP 文件。我知道ImageMagick并且它是 C++ 绑定Magick++,但我认为这对这个项目来说有点过头了,因为我目前对其他文件格式或平台不感兴趣。
就读取和写入 BMP 文件的代码设置而言,最简单的方法是什么?答案可能是“只使用 Magick++,它是最简单的”。
相关问题:最好的图像处理库是什么?
当只为 Windows 开发时,我通常只使用 ATL CImage类
EasyBMP如果您只想要 bmp 支持。我很简单,可以在几分钟内开始使用,如果你需要的话,它是多平台的。
一个 BMP 文件由 3 个结构组成。一个 BITMAPFILEHEADER 后跟一个 BITMAPINFO 后跟一个字节数组。
使用 Win32 加载 BMP 文件的最简单方法是调用 CreateFile、GetFileSize、ReadFile 和 CloseHandle 将文件图像加载到内存中,然后将指向缓冲区的指针投射到 BITMAPFILEHEADER 并从那里开始。
我撒谎,更简单的方法是调用LoadImage。确保传递 LR_DIBSECTION 标志以确保 GDI 不会将加载的图像转换为您的主显示器配置的任何位深度。这样做的好处是可以为您提供一个 HBITMAP,您可以将其选择到 DC 中,从而使用 GDI 进行绘制。
但是,要保存它,没有捷径可走。你需要准备一个 BITMAPFILEHEADER,写出来,填写一个 BITMAPINFO 结构,写出来,然后是实际的像素数据。
我按照上面的方法进行了尝试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");
}
CBitmap类执行BMP I/O。
#include <windows.h>
我没有使用 Magick++,但 Windows 有一个名为 Windows Imaging Component 的库,它可能会满足您的需求。