2010-03-22 18 views

Respuesta

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

Es más fácil cargar imágenes png del archivo que el recurso –

+0

Si quiere asegurarse de que el archivo existe, entonces verifique el código de retorno de la imagen. Cargue(); de lo contrario, podría (como lo hice) obtener un ASSERT. – akame

+0

La clase CPngImage hace lo mismo. (Disponible al menos desde 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

Esta variante me permitió dibujar en CDC m_img.Draw (dc.GetSafeHdc(), 0, 0, iWidth, iHeight, 0, 0, iWidth, iHeight); – BlackBada

+0

me salvaste el día, gracias – 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

Hay una CPngImage simple en el MFC. Se deriva de CBitmap y permite cargar un PNG como CBitmap.

AFAIK esta clase está disponible desde VS-2010.

3

Para PNG que provienen de recursos

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

te harán feliz. bitmap también se puede agregar a un CImageList.

+0

Es una pena que ese mapa de bits pierda todos los valores alfa, me faltaba transparencia al hacer BitBlt a CDC – BlackBada

Cuestiones relacionadas