如何使用MFC加载.png和.jpeg图像?

11

大家好,我想加载 png 图像和 jpeg 图像。

有人能帮助我吗?

7个回答

30
CImage image;
image.Load(_T("C:\\image.png")); // just change extension to load jpg
CBitmap bitmap;
bitmap.Attach(image.Detach());

1
从文件加载PNG图像比从资源加载更容易。 - Atiq Rahman
如果你想确保文件存在,那么请检查image.Load()的返回代码,否则你可能会像我一样遇到ASSERT错误。 - akame
类CPngImage也是如此。(自VS-2010以来可用) - xMRi

19
//----- load png into CImage from resource
bool Load( CImage * pimage, LPCTSTR lpszResourceName, HINSTANCE hinstRes)
{
    if (hinstRes == NULL)
    {
        hinstRes = AfxFindResourceHandle(lpszResourceName, _T("PNG") );
    }

    HRSRC hRsrc = ::FindResource(hinstRes, lpszResourceName, _T("PNG") );
    if (hRsrc == NULL)
    {
        return false;
    }

    HGLOBAL hGlobal = LoadResource(hinstRes, hRsrc);
    if (hGlobal == NULL)
    {
        return false;
    }

    LPBYTE lpBuffer = (LPBYTE) ::LockResource(hGlobal);
    if (lpBuffer == NULL)
    {
        FreeResource(hGlobal);
        return false;
    }

    bool bRes = false;
    {
        UINT uiSize = ::SizeofResource(hinstRes, hRsrc);

        HGLOBAL hRes = ::GlobalAlloc(GMEM_MOVEABLE, uiSize);
        if (hRes != NULL)
        {
            IStream* pStream = NULL;
            LPVOID lpResBuffer = ::GlobalLock(hRes);
            ASSERT (lpResBuffer != NULL);

            memcpy(lpResBuffer, lpBuffer, uiSize);

            HRESULT hResult = ::CreateStreamOnHGlobal(hRes, TRUE, &pStream);

            if( hResult == S_OK)
            {
                pimage->Load(pStream);
                pStream->Release();
                bRes= true;
            }
        }
    }

    UnlockResource(hGlobal);
    FreeResource(hGlobal);

    return bRes;
}

1
这个变量允许我向 CDC 绘图:m_img.Draw(dc.GetSafeHdc(), 0, 0, iWidth, iHeight, 0, 0, iWidth, iHeight); - blackbada_cpp

8

4

对于来自资源的PNG图片

CPngImage pngImage;
pngImage.Load(YOUR_RESOURCE_ID, AfxGetResourceHandle());
CBitmap bitmap;
bitmap.Attach(pngImage.Detach());

会让您感到愉快。可以将位图添加到CImageList中。


很遗憾这样的位图将失去所有的 alpha 值,当进行 BitBlt 到 CDC 时我缺少透明度。 - blackbada_cpp
为什么我的PNG图像已被包含在资源中,但是我不能在代码中使用它的ID?有人知道请帮忙。 - user123445151156

3

2
CString pngPath=L"D:\\k.png";
CImage pngImage;
CBitmap pngBmp; 
CDC bmDC;
CBitmap *pOldbmp;
BITMAP  bi;
//UINT xPos=450,yPos=300;
UINT xPos=10,yPos=10;
CClientDC dc(this);

pngImage.Load(pngPath);
// new code

pngBmp.Attach(pngImage.Detach());

bmDC.CreateCompatibleDC(&dc);

 pOldbmp= bmDC.SelectObject(&pngBmp);
 pngBmp.GetBitmap(&bi);
 dc.BitBlt(xPos,yPos,bi.bmWidth,bi.bmHeight,&bmDC,0,0,SRCCOPY);  
 bmDC.SelectObject(pOldbmp);

1

在MFC中有一个简单的CPngImage类,它是从CBitmap派生而来,并允许将PNG文件加载为CBitmap。

据我所知,自VS-2010以来就有这个类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接