c++ - 将位图作为 Windows 资源加载时,有没有办法保留 BITMAPFILEHEADER?

标签 c++ winapi bitmap resources

我一直在使用 SFML 1.4 测试一些东西(简单快速的多媒体库)带有 C++ 和 Visual C++ 2008 Express Edition。为了避免我的图形程序有外部图像,我正在测试 sf::Image::LoadFromMemory(const char * Data, std::size_t SizeInBytes)使用简单的资源脚本加载位图资源的功能:

IDB_SPRITE BITMAP "sprite1.bmp"

在我的代码中加载图像以创建一个 sf::Image使用此位图资源,我使用以下过程,由 Win32 API 函数组成(我排除了检查代码以确保 Win32 函数不返回 NULL 以缩短这一点):

HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDB_SPRITE), RT_BITMAP);
HGLOBAL hResData = LoadResource(NULL, hResInfo);
char * resourceData = reinterpret_cast<char *>(LockResource(hResData));

之后,我使用 sf::Image::LoadFromMemory 函数:

MyImage.LoadFromMemory(resourceData, SizeofResource(NULL, hResInfo));

但是,这不起作用(我收到未知文件类型错误)。经过一些测试,我发现我传递给 LoadFromMemory 函数的位图数据不包括 BITMAPFILEHEADER(前 14 个字节),我认为这是未知文件类型错误的原因。

我可以手动恢复 BITMAPFILEHEADER 并让 LoadFromMemory 函数正常工作。 但是,我想知道是否有某种方法可以在资源数据中保留 BITMAPFILEHEADER 以避免这样做?

最佳答案

使用自定义资源类型将保留整个文件。更改资源脚本以使用 RCDATA 类型而不是 BITMAP 类型:

IDB_SPRITE RCDATA "sprite1.bmp"

在 FindResource 函数调用中,使用 RT_RCDATA 而不是 RT_BITMAP:

HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDB_SPRITE), RT_RCDATA);

更多信息:

RCDATA Resource

Resource Types

关于c++ - 将位图作为 Windows 资源加载时,有没有办法保留 BITMAPFILEHEADER?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1134050/

相关文章:

c++ - C 库设施 header 的命名空间注入(inject)不一致

c++ - 在初始化对象之前在对象上运行的方法?

C++、win32、gdi 打印 : DrawEdge does not reach as far as DrawText?

c - 停止程序的简单有效方法

android - 更改可绘制对象并将其设置为 drawableLeft

C++重载虚拟+运算符

c++ - WinAPI/GDI : How to use GetDIBits() to get color table synthesized for a bitmap?

c# - 扫描的位图横向读取,翻转? (C#)

android - 带有背景图像的慢速应用程序

c++ - 如何获取硬盘驱动器的序列号