2010-03-22 20 views

risposta

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

È più semplice caricare le immagini PNG dal file rispetto alla risorsa –

+0

Se si vuole essere certi che il file esista, controllare il codice di ritorno image.Load(), altrimenti si potrebbe ottenere (come ho fatto) un ASSERT. – akame

+0

La classe CPngImage fa lo stesso. (Disponibile almeno dal VS-2010) – xMRi

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

Questa variante mi ha permesso di disegnare su CDC m_img.Draw (dc.GetSafeHdc(), 0, 0, iWidth, iHeight, 0, 0, iWidth, iHeight); – BlackBada

+0

hai salvato la mia giornata, grazie – Angelica

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

c'è una semplice CPngImage nel MFC. È derivato da CBitmap e consente di caricare un PNG come CBitmap.

AFAIK questa classe è disponibile da VS-2010.

3

Per PNG che provengono da risorse

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

vi renderà felici. bitmap può anche essere aggiunto a un CImageList.

+0

È un peccato che un tale bitmap possa perdere tutti i valori alpha, mi mancava la trasparenza quando eseguivo BitBlt su CDC – BlackBada

Problemi correlati