Ir al contenido



Foto

[MULTILENGUAJE] Leer archivos gráficos multipágina en varios formatos


  • Por favor identifícate para responder
No hay respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.855 mensajes
  • LocationMadrid - España

Escrito 12 junio 2014 - 01:47

En realidad el truco ya lo he publicado como contestación a este hilo, pero aprovecho para recopilarlo en esta sección de trucos y para escribirlo también en en C.

Esta función es capaz de leer y convertir a BITMAP una página de un archivo gráfico multipágina. Una ventaja añadida es que puede extraer el Bitmap de un archivo gráfico aunque no sea multipágina, extraerá el primero que pueda. En caso de ser multipágina y nos pesemos de rango, la función lo ajusta con el resto de la división, de forma que siempre devuelve un Bitmap.

Como ya hice otras veces usaré  GDI+ Flat API

Esta es la versión C:
 


cpp
  1. #pragma link "gdiplus.lib"
  2.  
  3. extern "C"{
  4. DWORD __stdcall GdiplusStartup(ULONG_PTR *hToken, void *input, void *Output);
  5. void  __stdcall GdiplusShutdown(ULONG_PTR token);
  6. DWORD __stdcall GdipCreateBitmapFromFile(WCHAR* filename, HANDLE* bitmap);
  7. DWORD __stdcall GdipCreateHBITMAPFromBitmap(HANDLE bitmap, HBITMAP* hBitmap, DWORD BKColor);
  8. DWORD __stdcall GdipImageGetFrameDimensionsList(HANDLE image, PGUID dimensionIDs, UINT count);
  9. DWORD __stdcall GdipImageGetFrameCount(HANDLE image, PGUID dimensionIDs, UINT *count);
  10. DWORD __stdcall GdipImageSelectActiveFrame(HANDLE image, PGUID dimensionIDs, UINT frameIndex);
  11. }
  12.  
  13.  
  14. HBITMAP CreateHBITMAPFromFilePage(PCHAR cFileName, UINT Index)
  15. {
  16.   // Pasamos a Unicode
  17.   WCHAR *FileName = new WCHAR[strlen(cFileName)+1];
  18.   int size = strlen(cFileName)*sizeof(WCHAR)+1;
  19.   MultiByteToWideChar(CP_ACP, 0, cFileName, -1, FileName, size);
  20.  
  21.   // Inicializamos GDI+.
  22.   HBITMAP hBitmap = 0;
  23.   ULONG_PTR  gdiplusToken;
  24.   char GdiPlusStartupInput[16] = {1,0};
  25.   if(!GdiplusStartup(&gdiplusToken, GdiPlusStartupInput, NULL)){
  26.     HANDLE GBitmap = 0;
  27.     GUID dimensionID;
  28.     UINT Frames;
  29.     GdipCreateBitmapFromFile(FileName, &GBitmap);
  30.     GdipImageGetFrameDimensionsList(GBitmap, &dimensionID, 1);
  31.     GdipImageGetFrameCount(GBitmap, &dimensionID, &Frames);
  32.     GdipImageSelectActiveFrame(GBitmap, &dimensionID, Index % Frames);
  33.     GdipCreateHBITMAPFromBitmap(GBitmap, &hBitmap, 0);
  34.  
  35.     // Cerramos GDI+
  36.     GdiplusShutdown(gdiplusToken);
  37.   }
  38.   delete FileName;
  39.   return hBitmap;
  40. }

Unos ejemplos de uso:


cpp
  1. Image1->Picture->Bitmap->Handle = CreateHBITMAPFromFilePage("Fax1.TIF", 4);
  2. Image1->Picture->Bitmap->Handle = CreateHBITMAPFromFilePage("Otro.gif", 6);

Y la versión delphi:


delphi
  1. type
  2.  
  3. function GdiplusStartup(var GdiToken: DWORD; Startup, Output: PBYTE): DWORD; stdcall external 'gdiplus';
  4. function GdipCreateBitmapFromFile(lpFileName: PWCHAR; var GBitmap: THANDLE): DWORD; stdcall external 'gdiplus';
  5. function GdipCreateHBITMAPFromBitmap(GBitmap: THANDLE; var hBitmap: HBITMAP; BKColor: DWORD): DWORD; stdcall external 'gdiplus';
  6. procedure GdiplusShutdown(GdiToken: DWORD); stdcall external 'gdiplus';
  7. function GdipImageGetFrameDimensionsList(image: THANDLE; var dimensionIDs: TGUID; count: DWORD): DWORD; stdcall external 'gdiplus';
  8. function GdipImageGetFrameCount(image: THANDLE; var dimensionID: TGUID; var count: DWORD): DWORD; stdcall external 'gdiplus';
  9. function GdipImageSelectActiveFrame(image: THANDLE; var dimensionID: TGUID; frameIndex: DWORD): DWORD; stdcall external 'gdiplus';
  10.  
  11. implementation
  12.  
  13. function CreateHBITMAPFromFilePage(cFileName: PCHAR; Index: DWORD): HBITMAP;
  14. var
  15.   FileName: array of WCHAR;
  16.   size: integer;
  17.   gdiplusToken: DWORD;
  18.   GdiPlusStartupInput: array[0..2] of int64;
  19.   GBitmap: THANDLE;
  20.   DimensionID: TGUID;
  21.   Frames: DWORD;
  22. begin
  23.   Result:= 0;
  24.  
  25.   // Pasamos a Unicode
  26.   SetLength(FileName, lstrlen(cFileName)+1);
  27.   size:= lstrlen(cFileName)*sizeof(WCHAR)+1;
  28.   MultiByteToWideChar(CP_ACP, 0, cFileName, -1, @FileName[0], size);
  29.  
  30.   // Inicializamos GDI+.
  31.   GdiPlusStartupInput[0]:= 1; GdiPlusStartupInput[1]:= 0;
  32.   if GdiplusStartup(gdiplusToken, @GdiPlusStartupInput, nil) = 0 then
  33.   begin
  34.     GdipCreateBitmapFromFile(PWCHAR(FileName), GBitmap);
  35.     GdipImageGetFrameDimensionsList(GBitmap, dimensionID, 1);
  36.     GdipImageGetFrameCount(GBitmap, dimensionID, Frames);
  37.     GdipImageSelectActiveFrame(GBitmap, dimensionID, Index mod Frames);
  38.     GdipCreateHBITMAPFromBitmap(GBitmap, Result, 0);
  39.  
  40.     // Cerramos GDI+
  41.     GdiplusShutdown(gdiplusToken);
  42.   end;
  43. end;

Ejemplo de uso:


delphi
  1. Image1.Picture.Bitmap.Handle:= CreateHBITMAPFromFilePage('Fax1.TIF', 4);
  2. Image1.Picture.Bitmap.Handle:= CreateHBITMAPFromFilePage('Otro.gif', 2);

Saludos.


  • 0