Ver Mensaje Individual
  #12  
Antiguo 28-11-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
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 *hTokenvoid *inputvoid *Output);
void  WINAPI GdiplusShutdown(ULONG_PTR token);
DWORD WINAPI GdipCreateBitmapFromHBITMAP(HBITMAP hBmpHPALETTE hPalHANDLEGBitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE BmpHBITMAPhBmpDWORD BKColor);
DWORD WINAPI GdipCreateFromHDC(HDC hDCHANDLEhGraphics);
DWORD WINAPI GdipDisposeImage(HANDLE hImage);
DWORD WINAPI GdipTranslateWorldTransform(HANDLE hGraphicsfloat sxfloat syDWORD Order);
DWORD WINAPI GdipRotateWorldTransform(HANDLE hGraphicsfloat AngleDWORD Order);
DWORD WINAPI GdipDrawImage(HANDLE hGraphicsHANDLE hImagefloat sxfloat sy);
DWORD WINAPI GdipDeleteGraphics(HANDLE hGraphics);
DWORD WINAPI GdipCreateBitmapFromFile(WCHARfilenameHANDLEbitmap);
DWORD WINAPI GdipCreateHBITMAPFromBitmap(HANDLE bitmapHBITMAPhBitmapDWORD BKColor);
//DWORD WINAPI GdipCreateBitmapFromResource(HINSTANCE hInstance, WCHAR* lpBitmapName, HANDLE* GBitmap);
DWORD WINAPI GdipCreateBitmapFromStream(IStreamstreamHANDLEGBitmap);


DWORD WINAPI GdipImageRotateFlip(HANDLE hImageDWORD 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;
  
IStreamStream;
  
ULONG_PTR  gdiplusToken;
  
GdiplusStartupInput gdiplusStartupInput = {0};
  
gdiplusStartupInput.GdiplusVersion 1;
  if(
GdiplusStartup(&gdiplusToken, &gdiplusStartupInputNULL)) return 0;

  
HRSRC Res FindResourceW(0FileNameRT_RCDATAW);//MAKEINTRESOURCEW(10));
  
if(Res){
    
DWORD Size SizeofResource(0Res);
    
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLESize);
    
LPVOID pImage = ::GlobalLock(hMem);
    
CopyMemory(pImageLockResource(LoadResource(0Res)), Size);
    ::
GlobalUnlock(hMem);
    ::
CreateStreamOnHGlobal(hMemtrue, &Stream);
    
GdipCreateBitmapFromStream(Stream, &GBitmap);
    
GdipCreateHBITMAPFromBitmap(GBitmap, &hBitmap0);
    
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