delphi - ¿Cómo hago un recurso PNG?
delphi-2009 resources (5)
Archivo de texto de ejemplo (llamado myres.rc):
MYPNG RCDATA mypng.png
Agregado al proyecto:
{$R ''myres.res'' ''myres.rc''}
Ejemplo de carga en tiempo de ejecución:
uses
PngImage;
var
Png: TPngImage;
begin
Png := TPngImage.Create;
try
Png.LoadFromResourceName(HInstance, ''MYPNG'');
Image1.Picture.Graphic := Png; // Image1: TImage on the form
finally
Png.Free;
end;
end;
Tengo un formulario con un TImage grande como fondo. El problema es que esto se almacena directamente en el DFM como un mapa de bits, que ocupa unos 3 MB. El archivo PNG original es ~ 250K. Me gustaría tratar de reducir la hinchazón insertando el PNG en un recurso, y luego hacer que el formulario lo cargue durante OnCreate. Puedo hacerlo ahora que Delphi 2009 incluye soporte PNG, excepto que no sé cómo crear un archivo de recursos con un archivo PNG. Alguien sabe cómo se hace eso?
Cuando se utiliza Resource Hacker , las imágenes PNG se agregan con ResType '' PNG '' en lugar de RT_RCDATA común.
Un TPngImage Class Helper ofrece una solución simple para este problema:
Type
TPngImageHelper = Class Helper For Vcl.Imaging.pngimage.TPngImage
Procedure LoadFromRHResourceName(Instance: HInst; Const Name: String);
End;
...
Procedure TPngImageHelper.LoadFromRHResourceName(Instance: HInst; Const Name: String);
Var
rs: TResourceStream;
Begin
rs := TResourceStream.Create(Instance, PChar(Name), ''PNG'');
Try
LoadFromStream(rs);
Finally
rs.Free;
End;
End;
Con un uso simple:
var
pngInfo: TPngImage;
begin
pngInfo := TPngImage.Create;
try
pngInfo.LoadFromRHResourceName(HInstance, ''MY_IMAGE.PNG'');
Image1.Picture.Graphic:= pngInfo;
finally
pngInfo.Free;
end;
end;
Para quienes usan C ++ Builder, este código funciona para mí:
En el archivo ResourceTest.rc
IMG_BMP BITMAP "Ressources//myimage.bmp";
IMG_PNG RCDATA "Ressources//myimage.png";
En el archivo ResourceTest.rh
#ifndef ResourceTestRH
#define ResourceTestRH
#define IMG_BMP "IMG_BMP"
#define IMG_PNG "IMG_PNG"
#endif
En el archivo ResourceTest.cpp
#include "pngimage.hpp"
// Loading bmp image from resource
Graphics::TBitmap *bmpImage = new Graphics::TBitmap();
bmpImage->LoadFromResourceName((int)HInstance, IMG_BMP);
// Loading png image from resource
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, IMG_PNG);
Si está utilizando Delphi 2009, TImage debe almacenar su archivo PNG como PNG en el archivo DFM. El DFM será más grande porque el contenido binario de la propiedad Picture.Data del objeto TImage está codificado en el DFM como texto hexadecimal. Pero cuando el DFM se compila en su EXE, se compila en un recurso binario. Su imagen debería ocupar el mismo espacio dentro del recurso RCDATA del formulario, ya que almacenaría el PNG en su propio recurso RCDATA.
Acabo de probar esto abriendo uno de mis propios archivos DFM Delphi 2009 que tienen un componente TImage con una imagen PNG cargada en tiempo de diseño en un editor de texto, copiando el contenido de la propiedad Picture.Data y pegándolos en un editor hexadecimal. El editor hexadecimal me muestra que la propiedad Picture.Data almacena un archivo PNG real con un prefijo de 10 bytes. El primer byte es $ 09 y el siguiente hechizo de 9 bytes TPngImage. Si elimino esos 10 bytes y guardo el archivo en el editor hexadecimal, obtengo un archivo PNG apropiado.
Entonces, si usa Delphi 2009, simplemente cargue la imagen PNG en un componente TImage en el momento del diseño.
bastante similar a mi ejemplo: http://www.ciuly.com/index.php/delphi/article/delphi/7-multimedia/10-pngfromresource.html