2010-03-22 62 views

回答

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

從文件加載png圖像比資源更容易 – 2013-10-10 03:40:47

+0

如果你想確保文件存在,然後檢查image.Load()返回碼,否則你可能會(如我一樣)得到一個ASSERT。 – akame 2014-03-04 11:55:02

+0

CPngImage類執行相同的操作。 (至少可用於VS-2010) – xMRi 2014-06-13 09:12:00

10
//----- 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; 
} 
+0

此變體允許我繪製到CDC m_img.Draw(dc.GetSafeHdc(),0,0,iWidth,iHeight,0,0,iWidth,iHeight); – BlackBada 2016-07-22 16:00:00

+0

你節省了我的一天,謝謝 – Angelica 2016-12-26 13:44:18

1
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); 
0

有一個在MFC簡單CPngImage。它來源於CBitmap並允許將一個PNG作爲CBitmap載入。

AFAIK本課程自VS-2010開始提供。

3

對於PNG圖像是來自資源

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

會讓你快樂。 bitmap也可以添加到CImageList

+0

這是一個遺憾,這樣的位圖會丟失所有的alpha值,我在爲CDC做BitBlt時缺少透明度 – BlackBada 2016-07-22 15:59:24

相關問題