Para evitar esto lo que vamos a hacer es meter la imagen dentro de un recurso compilado y posteriormente accederemos a la misma dentro del programa. La ventaja de utilizar este método es que la imagen sólo esta una vez en el programa independientemente del número de formularios donde vaya a aparecer.
Supongamos que vamos a meter la imagen MiBoton.jpg dentro de nuestro programa. Creamos al lado de la misma el archivo imagenes.rc el cual contiene:
1 RCDATA MiBoton.jpg
Se pueden meter en un archivo de recursos tantas imagenes como se desee, así como otros tipos de archivo (sonidos, animaciones flash, etc.). Las siguientes líneas serían:
2 RCDATA imagen2.jpg
3 RCDATA imagen3.jpg
...
Ahora abrimos una ventana de símbolo del sistema dentro del mismo directorio donde este la imagen y compilamos el recurso:
c:\imagenes\brc32 -r -v imagenes.rc
Lo cual nos creará el archivo imagenes.res.
Ahora para utilizar el recurso dentro de nuestro programa hay que añadir debajo de implementation (del formulario principal de la aplicación) la directiva {$R imagenes.res}:
implementation
{$R *.dfm}
{$R imagenes.res}
Esto lo que hace es unir todos los recursos de imagenes.res con nuestro ejecutable. Para cargar la imagen dentro de un objeto TImage hacemos lo siguiente:
procedure TFPrincipal.FormCreate( Sender: TObject );
var
Recursos: TResourceStream;
Imagen: TJPegImage;
begin
Imagen := TJPegImage.Create;
Recursos := TResourceStream.Create( hInstance, '#1', RT_RCDATA );
Recursos.Seek( 0, soFromBeginning );
Imagen.LoadFromStream( Recursos );
Imagen1.Canvas.Draw( 0, 0, Imagen );
Recursos.Free;
Imagen.Free;
end;
Donde Imagen1 es un objeto TImage. Aunque pueda parecer algo molesto tiene las siguientes ventajas:
- Evita que un usuario cualquiera utilice nuestras imagenes (a menos claro que sepa utilizar un editor de recursos).
- Facilita la distribución de nuestro programa (va todo en el exe).
- Se puede añadir cualquier tipo de archivo o dato dentro del ejecutable.
- Ahorramos mucha memoria al cargar una sola vez el recurso.
Pruebas realizadas en Delphi 7.
1 comentario:
Hola, he probado tu código pero cuando ejecuto la apliación me tira el error Jpeg #53
He probado a cambiar el formato de jpg a npg, da un error diferente en ejecucion pero igual sigue fallando. También he probado a reducir la resolucion de 96ppp a 72 y sigue con el mismo error.
¿como puedo arreglarlo?
un saludo y gracias por todo este trabajo.
Publicar un comentario