从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据



>我有一个存储在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);
}

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

相关内容

  • 没有找到相关文章

最新更新