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",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",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",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",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,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",(m_pImage == NULL ? -1 : m_pImage->GetLastStatus()));
            MessageBox(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 Professional Workstation Version 21H1

IDE:Visual Studio 2019(最新版本)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)