将Bitmap作为Windows资源加载时,有没有办法保留BITMAPFILEHEADER?

时间:2009-07-15 21:00:17

标签: c++ winapi bitmap resources

我一直在使用SFML 1.4(简单快速多媒体库)和C ++和Visual C ++ 2008 Express Edition来测试一些东西。为了避免使用我的图形程序获得外部图像,我正在使用简单的资源脚本测试加载了Bitmap资源的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以避免这样做?

2 个答案:

答案 0 :(得分:1)

使用自定义资源类型将保留整个文件。更改资源脚本以使用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

答案 1 :(得分:0)

您可以将文件作为自定义资源添加到资源而不是RT_BITMAP - 这将完全按照原样添加文件。除非你还需要:: LoadImage()它。