Ver Mensaje Individual
  #11  
Antiguo 28-11-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita