# Sunday, February 24, 2008

Google m'envoie plein de demandes d'internautes qui recherchent comment charger une image PNG ou JPEG depuis les ressources d'un programme C++.

Mettre un bitmap BMP dans les ressources, et le charger en C++/MFC, c'est facile. Y mettre un PNG ou JPEG, c'est un tout petit peu délicat.

D'abord, ajouter l'image dans le fichier ressources :

IDB_IMAGEPNG PNG "res\\image.png"

Puis la charger dans le code :

// Load image data from PNG section of the resource file
HINSTANCE hResourceModule = AfxGetResourceHandle();
HRSRC hRes = FindResource(hResourceModule, 
         MAKEINTRESOURCE(IDB_IMAGEPNG), _T("PNG"));
DWORD dwSizeResource = SizeofResource(hResourceModule, hRes);
HGLOBAL hMem = LoadResource(hResourceModule, hRes);

// Copy the PNG image data into a new buffer
BYTE *pRes = (BYTE *)LockResource(hMem);
HGLOBAL hImg = GlobalAlloc(GHND, dwSizeResource);
BYTE *pImg = (BYTE *)GlobalLock(hImg);
memcpy_s(pImg, dwSizeResource, pRes, dwSizeResource);
GlobalUnlock(hImg);

// Create a GDIPlus Bitmap from a HGLOBAL
IStream *pStream = NULL;
HRESULT hr = CreateStreamOnHGlobal(hMem, FALSE, &pStream);
Bitmap *pBitmap = new
Bitmap(pStream);
pStream->Release ();
GlobalFree(hImg);

Ce code fonctionne avec les images JPEG et GIF aussi bien que les PNG.
Tags  | 
 24 February 2008, 18:47