c++ - Gdiplus::Image::FromStream 返回 NULL
问题描述
我正在编写一个将 PNG 图片从资源文件加载到Gdiplus::Image
变量的函数。这是我写的函数:
bool CPngImage2::LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName)
{
ASSERT(m_pImage==NULL);
if (m_pImage!=NULL) return false;
HRSRC hResource=NULL;
HGLOBAL hGlobal=NULL;
IStream * pIStream=NULL;
try
{
hResource = FindResource(hInstance, pszResourceName, TEXT("PNG"));
if (hResource == NULL)
{
int err = GetLastError();
CString errstr;
errstr.Format(L"FindResource Error!\nError Code: %d", err);
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
hGlobal=LoadResource(hInstance,hResource);
if (hGlobal==NULL)
{
int err = GetLastError();
CString errstr;
errstr.Format(L"LoadResource Error!\nError Code: %d", err);
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
LPVOID pImageBuffer=LockResource(hGlobal);
if (pImageBuffer == NULL)
{
int err = GetLastError();
CString errstr;
errstr.Format(L"LockResource Error!\nError Code: %d", err);
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
DWORD dwImageSize=SizeofResource(hInstance,hResource);
if (dwImageSize == 0)
{
int err = GetLastError();
CString errstr;
errstr.Format(L"SizeofResource Error!\nError Code: %d", err);
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
CreateStreamOnHGlobal(NULL,TRUE,&pIStream);
if (pIStream==NULL)
{
int err = GetLastError();
CString errstr;
errstr.Format(L"CreateStreamOnHGlobal Error!\nError Code: %d", err);
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
HRESULT ret = pIStream->Write(pImageBuffer,dwImageSize,NULL);
if (ret != S_OK)
{
int err = GetLastError();
CString errstr;
errstr.Format(L"pIStream->Write Error!\nError Code: %d\nHRESULT return value: %d", err, ret);
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
m_pImage = Image::FromStream(pIStream);
if ((m_pImage == NULL) || (m_pImage->GetLastStatus() != Gdiplus::Ok))
{
int err = GetLastError();
CString errstr;
errstr.Format(L"Image::FromStream Error!\nError Code: %d\nImage Status: %d", err, (m_pImage == NULL ? -1 : m_pImage->GetLastStatus()));
MessageBox(NULL, errstr, NULL, MB_ICONERROR | MB_OK);
throw 0;
}
if (pIStream!=NULL) pIStream->Release();
if (hGlobal!=NULL)
{
UnlockResource(hGlobal);
FreeResource(hGlobal);
}
return true;
}
catch (...)
{
if (pIStream!=NULL) pIStream->Release();
if (hGlobal!=NULL)
{
UnlockResource(hGlobal);
FreeResource(hGlobal);
}
return false;
}
return true;
}
当我使用它加载图片时,它会弹出一个错误报告消息框:
图片::FromStream 错误!错误代码:0 图像状态:-1
而m_pImage 的值为NULL。我想知道是什么导致了这个错误,我该如何解决它。
环境信息:
系统:Windows 10 专业工作站版本 21H1
IDE:Visual Studio 2019(最新版本)
解决方案
推荐阅读
- python - 如何在 Flask-SocketIO 中打印 HTML 字符而不进行迭代(追加)?
- laravel - Laravel:从数据库设置配置文件的值
- stata - 如何在Stata中的广义估计方程后检查自相关?
- python - 制作和打印包含输入值的字典的代码输出不完整的字典;为什么?
- postgresql - Ecto - 在单个查询中返回按日期分组的时间戳记录
- cloudify - 如何在不使用 cloudify 更改 OS 中子网 UUID 的情况下使用 execute_operation 更新子网名称
- docker - 在 Docker 上运行时出现 Redis 错误“无法打开 RDB 文件 dump.rdb”
- awk - sed:-e 表达式#1,字符 2:命令后的额外字符
- node.js - Node JS - 排队 MySQL 插入查询
- json - 解析json postgresql查询