No hace mucho publiqué un truco para cargar imágenes de un recurso que admitía varios formatos usando GDI+. El mensaje original en delphi y C++ se encuentra aquí:
Cargar una Imagen de un Resource RT_RCDATA con API pura y GDI+ Flat
El código es el siguiente:
El archivo de recursos RC:
Código PHP:
Imagen1 RCDATA "Imagen1.png"
Imagen2 RCDATA "Imagen2.jpg"
La función de carga:
CreateHBITMAPFromRCDATAResurce (sobran declaraciones de APIs GDI+ pero ahí quedan por si las queréis para otros usos)
Código PHP:
#include <windows.h>
#pragma link "Gdiplus.lib"
#pragma resource "MiArchivo.res"
extern "C" {
DWORD WINAPI GdiplusStartup(ULONG_PTR *hToken, void *input, void *Output);
void WINAPI GdiplusShutdown(ULONG_PTR token);
DWORD WINAPI GdipCreateBitmapFromHBITMAP(HBITMAP hBmp, HPALETTE hPal, HANDLE* GBitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE Bmp, HBITMAP* hBmp, DWORD BKColor);
DWORD WINAPI GdipCreateFromHDC(HDC hDC, HANDLE* hGraphics);
DWORD WINAPI GdipDisposeImage(HANDLE hImage);
DWORD WINAPI GdipTranslateWorldTransform(HANDLE hGraphics, float sx, float sy, DWORD Order);
DWORD WINAPI GdipRotateWorldTransform(HANDLE hGraphics, float Angle, DWORD Order);
DWORD WINAPI GdipDrawImage(HANDLE hGraphics, HANDLE hImage, float sx, float sy);
DWORD WINAPI GdipDeleteGraphics(HANDLE hGraphics);
DWORD WINAPI GdipCreateBitmapFromFile(WCHAR* filename, HANDLE* bitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE bitmap, HBITMAP* hBitmap, DWORD BKColor);
//DWORD WINAPI GdipCreateBitmapFromResource(HINSTANCE hInstance, WCHAR* lpBitmapName, HANDLE* GBitmap);
DWORD WINAPI GdipCreateBitmapFromStream(IStream* stream, HANDLE* GBitmap);
DWORD WINAPI GdipImageRotateFlip(HANDLE hImage, DWORD rfType);
}
TForm1 *Form1;
typedef struct {
UINT32 GdiplusVersion;
PVOID DebugEventCallback; //DebugEventProc
BOOL SuppressBackgroundThread;
BOOL SuppressExternalCodecs;
} GdiplusStartupInput;
HBITMAP CreateHBITMAPFromRCDATAResurce(PWCHAR FileName)
{
PWCHAR RT_RCDATAW = MAKEINTRESOURCEW(10);
HBITMAP hBitmap = 0;
HANDLE GBitmap = 0;
IStream* Stream;
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput = {0};
gdiplusStartupInput.GdiplusVersion = 1;
if(GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL)) return 0;
HRSRC Res = FindResourceW(0, FileName, RT_RCDATAW);//MAKEINTRESOURCEW(10));
if(Res){
DWORD Size = SizeofResource(0, Res);
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, Size);
LPVOID pImage = ::GlobalLock(hMem);
CopyMemory(pImage, LockResource(LoadResource(0, Res)), Size);
::GlobalUnlock(hMem);
::CreateStreamOnHGlobal(hMem, true, &Stream);
GdipCreateBitmapFromStream(Stream, &GBitmap);
GdipCreateHBITMAPFromBitmap(GBitmap, &hBitmap, 0);
GdipDisposeImage(GBitmap);
//GlobalFree(hMem);
Stream->Release();
}
//shutdown GDI+
GdiplusShutdown(gdiplusToken);
return hBitmap;
}
Un ejemplo de uso:
Código PHP:
Image1->Picture->Bitmap->Handle = CreateHBITMAPFromRCDATAResurce(L"Imagen1");
Saludos.