C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是啥?
Posted
技术标签:
【中文标题】C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是啥?【英文标题】:C++: What's the simplest way to read and write BMP files using C++ on Windows?C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是什么? 【发布时间】:2008-10-13 23:21:08 【问题描述】:我想加载一个 BMP 文件,在内存中对其进行一些操作,然后在 Windows(Win32 原生)上使用 C++ 输出一个新的 BMP 文件。我知道 ImageMagick 和它是 C++ 绑定 Magick++,但我认为这对这个项目来说有点过头了,因为我目前对其他文件格式或平台不感兴趣。
就读取和写入 BMP 文件的代码设置而言,最简单的方法是什么?答案可能是“只需使用 Magick++,它是最简单的。”
相关问题:What is the best image manipulation library?
【问题讨论】:
相关问题已被审核删除。 【参考方案1】:当只为 Windows 开发时,我通常只使用 ATL CImage 类
【讨论】:
我认为 CImage 是共享 MFC/ATL 类的一部分 - 与需要 MFC 的 CBitmap 类相比,它可能更容易包含。 是的,你只需要包含 atlimage.h 如果您不只针对 Windows 怎么办? 我有一个自定义位图类,我在为其他平台开发应用程序或需要更多灵活性的地方使用它。 BMP 格式比较简单。如果您需要跨平台的东西,在 SourceForge 上还有一个名为 EasyBMP 的开源库(BSD 许可)。【参考方案2】:EasyBMP 如果你只想要 bmp 支持。我很简单,可以在几分钟内开始使用,如果你需要的话,它是多平台的。
【讨论】:
【参考方案3】:一个 BMP 文件由 3 个结构组成。一个 BITMAPFILEHEADER 后跟一个 BITMAPINFO 后跟一个字节数组。
使用 Win32 加载 BMP 文件最简单的方法是调用 CreateFile、GetFileSize、ReadFile 和 CloseHandle 将文件图像加载到内存中,然后将指向缓冲区的指针转换为 BITMAPFILEHEADER 并从那里开始。
我撒谎,更简单的方法是调用LoadImage。确保传递 LR_DIBSECTION 标志以确保 GDI 不会将加载的图像转换为您的主显示器配置的任何位深度。这样做的好处是可以为您提供一个 HBITMAP,您可以将其选择到 DC 中,从而使用 GDI 进行绘制。
然而,要保存它,没有捷径可走。你需要准备一个 BITMAPFILEHEADER,写出来,填写一个 BITMAPINFO 结构,写出来,然后是实际的像素数据。
【讨论】:
【参考方案4】:我如上所述尝试了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。我不喜欢单片头,也不喜欢它会引发很多警告。【参考方案5】:CBitmap 类执行 BMP I/O。
【讨论】:
【参考方案6】:#include <windows.h>
LoadImage
【讨论】:
哦不,我的意思是包含(尖锐)“windows.h”,但我的部分评论丢失了【参考方案7】:我没有使用 Magick++,但 Windows 有一个名为 Windows Imaging Component 的库,它可能会满足您的需求。
【讨论】:
以上是关于C++:在 Windows 上使用 C++ 读写 BMP 文件的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.
如何在 Windows 上使用 C++ 在特定音频设备上播放声音?