首页 > 解决方案 > 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(最新版本)

标签: c++image-processingvisual-c++mfcgdi+

解决方案


推荐阅读