>我有一个存储在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 文件数据。
谢谢!
john"应该为这个正确的解决方案而受到赞扬,因为他(通过评论(引导我[是的,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);
}
为了简洁起见,我排除了错误捕获。