【问题标题】:Get png file data from a png stored as a Windows resource (c++) [duplicate]从存储为Windows资源的png获取png文件数据(c ++)[重复]
【发布时间】:2023-03-21 04:07:02
【问题描述】:

我有一个存储在 Windows exe 中的 PNG 资源。我想加载 png 资源并创建指向可以写入磁盘的 png 数据的指针以创建 png 文件。 (FWIW,此时我实际上并没有创建文件;数据最初写入另一个文件中,然后保存为 png 文件。)这是在 MFC (c++) 项目中,但解决方案不需要使用 MFC。

我设想一个这样的函数原型:

void GetPngFromResource(int iResourceID, VOID* pPngFileData, DWORD* pwPngDataBytes);

我看到 ::LoadBitmap()、::LoadImage() 和 CImage::LoadFromResource() 不支持 png 资源加载。当我尝试使用 LoadImage() 时,GetLastError() 报告“在图像文件中找不到指定的资源名称”(错误 1814):

HBITMAP hBitmapImage = (HBITMAP)::LoadImage(::GetModuleHandle(0), MAKEINTRESOURCE(iResourceID), IMAGE_BITMAP, 0, 0, 0);

我知道资源存在,因为我可以使用 FindResource() 获取它的句柄(虽然我不知道如何或是否有可能从 HRSCR 句柄中获取 png 文件数据):

HRSCR h = FindResource(HINST_THISCOMPONENT, MAKEINTRESOURCE(iResourceID), L"PNG");

我见过使用 gdi+ 从 png 资源创建 HBITMAP 的示例,但我需要以 png 文件数据结束。

谢谢!

【问题讨论】:

  • FindResource 后跟 LoadResource 后跟 LockResource 曾经是执行此操作的方法。但我的知识可能已经过时了。
  • John,我看到了使用这些函数从资源加载 png 并创建 HBITMAP(但不是 png)的示例代码。我怀疑这是正确的方向,但超出了我的专业知识范围。
  • LockResource 为您提供指向资源数据的指针。到时候你就靠自己了。但是您应该能够使用该指针以及资源大小来创建您的文件。
  • 有一个 SizeofResource 函数可以为您提供资源的大小(以字节为单位)。
  • 如果你不想要位图,那么这些 GDI 东西是什么?

标签: c++ bitmap mfc png


【解决方案1】:

“john”值得称赞这个正确的解决方案,因为他引导我(通过 cmets)[是的,SO 神将我的问题标记为重复,我不能选择这个作为解决方案,但它是] .

void GetPngFromResource(int iResourceID, void** ppPngFileData, DWORD* pwPngDataBytes)
{
    HMODULE hMod = GetModuleHandle(NULL);
    HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(iResourceID), _T("PNG"));
    HGLOBAL hGlobal = LoadResource(hMod, hRes);
    *ppPngFileData = LockResource(hGlobal);
    *pwPngDataBytes = SizeofResource(hMod, hRes);
}

为简洁起见,我排除了错误捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多