Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Obtener nombre de archivo de imagen (https://www.clubdelphi.com/foros/showthread.php?t=86689)

radenf 17-09-2014 15:32:07

Obtener nombre de archivo de imagen
 
Hola amigos:

Estoy utilizando el siguiente código, modificado del que ha publicado Neftalí, para visualizar miniaturas de imágenes.
Los nombres de archivo de las imágenes se cargan en un ImageList (TStringList), seleccionando una carpeta del disco duro.

Código Delphi [-]
procedure TFormPrincipal.CreateImages(ImageList: TStringList);
var
Image:TImage;
I:Integer;
begin
ScrollBox1.Width:= 180 * ImageList.Count;
for I := 0 to (ImageList.Count- 1) do begin
Image:= TImage.Create(nil);
Image.Parent:= ScrollBox1;
Image.Height:= 180;
Image.Width:= 180;
Image.Top:= 10;
Image.Left:= ((Image.Width + 8) * I);
Image.Transparent:= true;
Image.Align:= alLeft;
Image.Stretch:= True;
Image.Proportional:= True;
Image.IncrementalDisplay:= True;
Image.Center:= True;
Image.Picture.LoadFromFile(ImageList[i]);
Image.OnClick := ClickImage;
ObjectList.Add(Image);
ScrollBox1.Refresh;
end;
end;

Funciona sin problemas y las imágenes se ven perfectas en un TImage, con el siguiente código:

Código Delphi [-]
procedure TFormPrincipal.ClickImage(Sender: TObject);
begin
Image1.Bitmap.Assign(TImage(Sender).Picture);
end;

Necesito sin embargo, poder obtener el nombre del archivo de la imagen seleccionada, en un Label o Edit, al hacer click sobre la miniatura, para acceder a su metadata utilizando la librería CCR Exif.

Agradezco su valiosa ayuda
Saludos

duilioisola 17-09-2014 17:17:19

Puedes utilizar la propiedad Tag del TImage para guardar el número de imagen del ImageList.
Todos los componentes tienen esta propiedad.

Sería algo así:
Código Delphi [-]
procedure TFormPrincipal.CreateImages(ImageList: TStringList);
var
Image:TImage;
I:Integer;
begin
  ScrollBox1.Width:= 180 * ImageList.Count;
  for I := 0 to (ImageList.Count- 1) do begin
    Image:= TImage.Create(nil);
    Image.Parent:= ScrollBox1;
    Image.Height:= 180;
    Image.Width:= 180;
    Image.Top:= 10;
    Image.Left:= ((Image.Width + 8) * I);
    Image.Transparent:= true;
    Image.Align:= alLeft;
    Image.Stretch:= True;
    Image.Proportional:= True;
    Image.IncrementalDisplay:= True;
    Image.Center:= True;
    Image.Tag := I; // Aquí guardo el índice del ImageList
    Image.Picture.LoadFromFile(ImageList[i]);
    Image.OnClick := ClickImage;
    ObjectList.Add(Image);
    ScrollBox1.Refresh;
  end;
end;

procedure TFormPrincipal.ClickImage(Sender: TObject);
begin
  Image1.Bitmap.Assign(TImage(Sender).Picture);
  ShowMessage('El nombre del archivo es: ' + ImageList[Image.Tag]);
end;

radenf 17-09-2014 19:19:38

Muchas gracias por responder [duilioisola].

Usé el código que incluiste, pero selecciona el último archivo de imagen del ImageList y no el que debiera al hacer click en la miniatura.
Debí sin embargo declarar en private Image:TImage, porque si no aparece como no declarado el [Image.Tag] y si lo incorporo como variable en el ClickImage da un access violation.
Saludos y muchas gracias

duilioisola 17-09-2014 19:51:59

Si, no me di cuenta de tomar la imagen que está siendo clicada.
Sender, es la imagen, por lo tanto TImage(Sender).Tag te devolverá el Tag de esa imagen.
NO DEBES INCLUIR IMAGE EN LA DECLARACION PRIVATE.
El procedimiento ClickImage quedaría así:
Código Delphi [-]
procedure TFormPrincipal.ClickImage(Sender: TObject);
begin
  Image1.Bitmap.Assign(TImage(Sender).Picture);
  ShowMessage('El nombre del archivo es: ' + ImageList[TImage(Sender).Tag]);
end;

radenf 17-09-2014 21:34:42

Muchas gracias [duilioisola].
Me alegraste el día. Funcionó perfecto.
Ya que de esta manera, con este código puedo obtener las coordenadas GPS de la imagen.

Código Delphi [-]
procedure TFormPrincipal.ClickImage(Sender: TObject);
var
ExifData: TExifData;
begin
Image1.Bitmap.Assign(TImage(Sender).Picture);
Image2.Bitmap.Assign(TImage(Sender).Picture);
Edit1.Text:= ImageList[TImage(Sender).Tag];
ExifData := TExifData.Create;
try
ExifData.LoadFromGraphic(Edit1.Text);
Label1.Caption:= 'Latitud: ' + ExifData.GPSLatitude.ToString + ' / Longitud: '+ ExifData.GPSLongitude.ToString;
finally
ExifData.Free;
end;
end;

Sólo me falta transformar las coordenadas geográficas a formato decimal para mostrar en un mapa dónde se tomó la fotografía.

Un abrazo


La franja horaria es GMT +2. Ahora son las 11:22:11.

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