29-11-2017
|
|
Miembro
|
|
Registrado: may 2013
Posts: 885
Reputación: 11
|
|
Cita:
Empezado por escafandra
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.
|
Una cosa amigo, intento reproducir tu codigo y practicamente esta hecho pero me falta la libreria gdiplus.lib ¿de donde la saco? Lo digo porque me lo he bajado el GDI+ desde microsoft y no viene ningun .h ni .lib, solo viene una dll, un .cat, y un .man.
Última edición por aguml fecha: 29-11-2017 a las 15:21:41.
|