PDA

Ver la Versión Completa : Cargar imagen


federki
13-11-2006, 20:54:16
Hola a todos..
Perdonad mi ignorancia, porque debe ser muy fácil y no doy con ello.
Tengo un formulario con una TImage. Si voy a las propiedades de la Imagen tengo que pulsando en Picture puedo cargar la imagen que quiero usar y esa imagen se queda guardada y cuando ejecuto mi aplicación en cualquier ordenador, pues la imagen aparece.

Pues lo que quiero hacer es eso mediante código. ¿Como puedo cargar una imagen para que se quede en el programa?
Por ej. si utilizo:
Imagen.Bitmap.LoadFromFile('C:\img.bmp');
La imagen no se carga en otro ordenador porque la imagen img.bmp no existe.

Estoy seguro que esto es muy sencillo, por favor que alguien me eche una mano.
Gracias.

dec
13-11-2006, 20:58:35
Hola,

Tendrás que utilizar una ruta "relativa" a tu aplicación. De este modo, esté en el ordenador que esté, la imagen (si existe) se cargará. ¿Cómo usar una ruta relativa a tu aplicación? Bueno. Hay funciones que te echan una mano. Por ejemplo, supongamos que tienes una carpeta de nombre "img" en el directorio en que se encuentra el ejecutable de tu aplicación.

Si utilizas la función "ExtractFilePath" pasándole como parámetro tu ejecuable (Application.ExeName) podrías codificar algo como esto:


var
rutaImagen: string;
begin
rutaImagen := ExtractFilePath(Application.ExeName) +'img\'+ 'nombre-imagen.jpg';
Image1.LoadFromFile(rutaImagen);
{...}
end;


¿Coges la idea? Es muy sencillo. Se trata de partir de la ruta de tu ejecutable, es decir, del directorio en donde este se encuentre. A partir de ahí puedes utilizar los archivos y carpetas de dicho directorio de forma que no tengas que construir una ruta "absoluta" del tipo "C:\Archivos de programa\..." porque, evidentemente, estas rutas pueden ser válidas en tu ordenador, pero, no tienen por qué serlo en todos.

federki
13-11-2006, 21:05:29
Gracias dec por tu pronta respuesta..
La verdad que me parece muy buena tu idea pero tengo un pequeño incoveniente, que el programa que estoy haciendo es un instalador, e imagínate lo horrible que es tener que instalar el programa y tener una carpeta con las imágenes que quiero mostrar aparte.

Si mi programa no fuera un instalador usaría tu forma, pero así no puedo hacerlo..
Muchas gracias.

dec
13-11-2006, 21:09:35
Hola,

Bueno. No sé qué tipo de programa estás haciendo, quiero decir que no me queda claro qué quieres decir con que es un "instalador". Si estás utilizando InnoSetup (http://www.jrsoftware.org/), por poner un ejemplo, no hay ningún dilema en incluir las imágenes que estimes oportuno, en la carpeta que estimes oportuno: por ejemplo en un subdirectorio dentro de la carpeta en que se instale/copie tu ejecutable.

No sé. Si pudieras dar alguna información más... tal vez alguien pueda echarte una mano. :)

Caral
13-11-2006, 21:12:40
Hola federki
La verdad como no se, entonces lo haria a lo aprendiz.
Haria un form que tenga las imagenes que necesito dentro de este, como las guarda el sistema, ya las tengo.
Cuando necesite una foto determinada nada mas indico el nombre de la imagen y se lo paso a la otra vacia en otro form.
Es una opinion.
Saludos

seoane
13-11-2006, 21:20:11
Le estoy dando vueltas a tu pregunta y no tengo muy claro lo que quieres. dec supone que tu tienes la imagen que quieres cargar dentro del directorio de tu aplicación o en un subdirectorio de la misma, y que tu duda es como poder encontrarla. Si es así la respuesta de dec es correctisima ... bueno quizá quitándole una pequeña errata ;)

Image1.Picture.LoadFromFile(rutaImagen);


Ahora bien, puede que tu estés preguntando por un método para incluir una imagen dentro de tu ejecutable por código. Eso ya es un poco mas complicado, partiendo de que un ejecutable no se puede modificar a si mismo y que la imagen se tendría que agregar como un recurso. Se podría hacer, pero no creo que valga la pena.

Por ultimo también se me ocurre que puedes estar preguntando como mostrar un cuadro de dialogo para seleccionar una imagen, y que en sucesivas ejecuciones ya siempre se utilice la misma ruta. Eso ya es mas sencillo, por ejemplo para obtener la ruta, y guardarla:


begin
with TOpenDialog.Create(nil) do
try
if Execute then
begin
Image1.Picture.LoadFromFile(Filename);
with TStringList.Create do
try
Values['Ruta']:= ExpandFileName(Filename);
SaveToFile(ChangeFileExt(ParamStr(0),'.ini'));
finally
Free;
end;
end;
finally
Free;
end;
end;


El código anterior puedes ponerlo por ejemplo dentro de un botón. Ahora ya tenemos la ruta de la imagen en nuestro archivo de inicio, ahora solo falta que cuando se inicie la aplicación comprobemos si hay alguna ruta guardada y carguemos la imagen. Por ejemplo en el evento OnCreate del formulario coloca esto:


procedure TForm1.FormCreate(Sender: TObject);
begin
if FileExists(ChangeFileExt(ParamStr(0),'.ini')) then
with TStringList.Create do
try
LoadFromFile(ChangeFileExt(ParamStr(0),'.ini'));
if Values['Ruta']<>'' then
Image1.Picture.LoadFromFile(Values['Ruta']);
finally
Free;
end;
end;

federki
13-11-2006, 21:30:46
Primeramente MUCHAS A TODOS por vuestra impresionante ayuda..

Decir que dec ha acertado de lleno en lo que estoy haciendo.
Estoy haciendo un instalador con InnoSetup. Y el problema es ese que he creado un TBitmapImage.

dec:"no hay ningún dilema en incluir las imágenes que estimes oportuno, en la carpeta que estimes oportuno: por ejemplo en un subdirectorio dentro de la carpeta en que se instale/copie tu ejecutable."
Yo sé crear la carpeta, pero pienso que la imagen se cargará antes de que se cree la carpeta.
Si pudieras poner un simple ej. para orientarme te lo agradecería, porque has entendido lo que quiero hacer.

Sigo leyendo vuestras respuestas:
seoane dice: "Ahora bien, puede que tu estés preguntando por un método para incluir una imagen dentro de tu ejecutable por código. Eso ya es un poco mas complicado, partiendo de que un ejecutable no se puede modificar a si mismo y que la imagen se tendría que agregar como un recurso. Se podría hacer, pero no creo que valga la pena."
Esto es lo que quiero hacer seoane..

dec
13-11-2006, 22:06:35
Hola,

En InnoSetup cuentas con un Script de ejemplo de nombre "CodeClasses.iss". En el mismo se utilizan, entre otras clases soportadas, el "TBitmapImage". Puede verse como se incluye (temporalmente) un determinado archivo de imagen, y cómo luego se crea una instancia de la clase mencionada y se carga (desde el directorio temporal correspondiente) la imagen susomentada. Echa un vistazo. Es interesante y creo que resuelve el problema.

Por cierto, la clase "TBitmapImage" se añadió a InnoSetup en la versión 4.1.2. Asegúrate de que utilizas esa versión o una superior.

Aquí un extracto del código fuente del Script de InnoSetup que he mencionado:



[ Files ]
Source: compiler:WizModernSmallImage.bmp; Flags: dontcopy

[ Code ]

{ TBitmapImage }

Page := CreateCustomPage(Page.ID, 'Custom wizard page controls', 'TBitmapImage');

BitmapFileName := ExpandConstant('{tmp}\WizModernSmallImage.bmp');
ExtractTemporaryFile(ExtractFileName(BitmapFileName));

BitmapImage := TBitmapImage.Create(Page);
BitmapImage.AutoSize := True;
BitmapImage.Bitmap.LoadFromFile(BitmapFileName);
BitmapImage.Parent := Page.Surface;

federki
13-11-2006, 22:48:22
MUCHAS GRACIAS David
Tema solucionado..:)