【问题标题】:Is there a way to preserve the BITMAPFILEHEADER when loading a Bitmap as a Windows resource?将位图作为 Windows 资源加载时,有没有办法保留 BITMAPFILEHEADER?
【发布时间】:2010-11-11 04:01:03
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi bitmap resources


    【解决方案1】:

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

    【讨论】:

    • 改用标准的 RT_RCDATA 资源类型。存储原始数据就是它的意义所在。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      相关资源
      最近更新 更多