【发布时间】: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 东西是什么?