Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Cargar png en Delphi 6 (https://www.clubdelphi.com/foros/showthread.php?t=77404)

noob 22-01-2012 20:37:37

Cargar png en Delphi 6
 
Hola,

Estoy tratando de cargar un .png pero obtengo este error en tiempo de ejecución:
Cita:

EInvalidGraphic with message 'Unknown picture file extension (.png)'
Para cargar una imagen en formato .jpg uso la unidad 'Jpeg' pero para una imagen en formato .png no se cual se ha de usar. ¿Me echáis una mano?

Gracias.

Casimiro Notevi 22-01-2012 20:51:23

Aquí encontrarás algunos que pueden servirte.

noob 23-01-2012 00:25:57

Gracias.

¿No se soporta de manera nativa?

Casimiro Notevi 23-01-2012 00:33:19

Me parece recordar que no.

noob 23-01-2012 00:44:34

¿Me podrían orientar en cómo podría instalar el PngImage?

escafandra 23-01-2012 01:40:53

Cita:

Empezado por noob (Mensaje 423523)
¿No se soporta de manera nativa?

Como te indica Casimiro Notevi delphi no lo soporta de forma nativa pero Windows si con el GDI+.

Cita:

Empezado por noob (Mensaje 423525)
¿Me podrían orientar en cómo podría instalar el PngImage?

Pega ese código en un fichero de texto llamado PngImage.pas y lo incluyes en tu proyecto.


Hace unos meses publiqué aquí una función para crear un HBITMAP desde un archivo soportando varios formatos, incluido el png. El código usa exclusivamente la API y está en C++ y Delphi. Con un HBITMAP se puede cargar la imagen en un TImage con suma facilidad.

La ventaja de ese código es que soporta mas formatos que el npg, al menos BMP, GIF, JPEG, PNG y TIFF. El número y tipo de formatos de pende de Windows.

Transcribo el código en delphi:
Código Delphi [-]
function GdiplusStartup(var GdiToken: DWORD; Startup, Output: PBYTE): DWORD; stdcall external 'gdiplus';
function GdipCreateBitmapFromFile(lpFileName: PWCHAR; var GBitmap: THANDLE): DWORD; stdcall external 'gdiplus';
function GdipCreateHBITMAPFromBitmap(GBitmap: THANDLE; var hBitmap: HBITMAP; BKColor: DWORD): DWORD; stdcall external 'gdiplus';
procedure GdiplusShutdown(GdiToken: DWORD); stdcall external 'gdiplus';
 
function CreateHBITMAPFromFile(cFileName: PCHAR): HBITMAP;
var
  FileName: array of WCHAR;
  size: integer;
  gdiplusToken: DWORD;
  GdiPlusStartupInput: array[0..2] of int64;
  GBitmap: THANDLE;
 
begin
  Result:= 0;
 
  // Pasamos a Unicode
  SetLength(FileName, lstrlen(cFileName)+1);
  size:= lstrlen(cFileName)*sizeof(WCHAR)+1;
  MultiByteToWideChar(CP_ACP, 0, cFileName, -1, @FileName[0], size);
  
  // Inicializamos GDI+.
  GdiPlusStartupInput[0]:= 1; GdiPlusStartupInput[1]:= 0;
  if GdiplusStartup(gdiplusToken, @GdiPlusStartupInput, nil) = 0 then
  begin
    GdipCreateBitmapFromFile(PWCHAR(FileName), GBitmap);
    GdipCreateHBITMAPFromBitmap(GBitmap, Result, 0);
 
    // Cerramos GDI+
    GdiplusShutdown(gdiplusToken);
  end;
end;

Un ejemplo de uso para cargar una imagen.png en un TImage:
Código Delphi [-]
Image1.Picture.Bitmap.Handle:= CreateHBITMAPFromFile('Image.png');

Espero te sea de utilidad.


Saludos.

noob 23-01-2012 07:19:23

Cita:

Empezado por escafandra (Mensaje 423527)
Pega ese código en un fichero de texto llamado PngImage.pas y lo incluyes en tu proyecto.

¿Y si lo quisiera utilizar en Borland C++ Builder 6? ¿Cómo debería proceder con ese .pas?

Gracias.

escafandra 23-01-2012 08:08:38

Cita:

Empezado por noob (Mensaje 423530)
¿Y si lo quisiera utilizar en Borland C++ Builder 6? ¿Cómo debería proceder con ese .pas?

Igual que para delphi. Lee esto.

De todas formas, como te comenté en el enlace que te dí mas arriba, tienes una versión del código, que puse en delphi, para Builder. Funciona perfectamente en C++ Builder 6. También te puede interesar esto.


Saludos.


La franja horaria es GMT +2. Ahora son las 16:16:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi