Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   leer imagenes jpg dentro de una carpeta (https://www.clubdelphi.com/foros/showthread.php?t=74131)

ingmichel 01-06-2011 02:35:45

leer imagenes jpg dentro de una carpeta
 
hola amigos del foro como estan, estoy realizando un sistema de digitalizacion y requiero leer n imaganes con formato .jpg que se encuentran en una carpeta determinada carpeta en mi formulario delphi, para leer una imagen no tengo problemas, pero lo que requiero es leer todas las imagenes que contenga la carpeta, por favor si alguien ha hecho algo parecido le agradeceria mucho su ayuda.

gracias de antemano...

ecfisa 01-06-2011 02:58:39

Hola ingmichel.

Para leer los archivos .JPG te podés valer de las funciones FindFirst y FindNext. Como supongo que querrás almacener la ruta y el nombre de cada imágen,
creo que usar un TStrings es lo indicado.

Código Delphi [-]
...
uses JPeg, ExtCtrls;

procedure LeerJPGS(const Ruta: string; Nombres: TStrings);
var
  SR: TSearchRec;
begin
  if FindFirst(Ruta+'\*.JPG',faArchive, SR) = 0 then
  begin
    repeat
      Nombres.Add(Ruta+'\'+SR.Name);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;

Y para ponerte un ejemplo que sea funcional, uso un TScrollBox donde voy a hubicar las imágenes cuyos nombres están almacenados en la variable
de tipo TStrings.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Nombres: TStrings;
  Img: TImage;
  i: Integer;
begin
  Nombres:= TStringList.Create;
  try
    LeerJPGS('C:\Users\Tu_Nombre_De_Usuario\Pictures',Nombres);
    for i:= 0 to Nombres.Count -1 do
    begin
      Img:= TImage.Create(Self);
      Img.Picture.LoadFromFile(Nombres[i]);
      Img.Height:= 150;
      Img.Width:= 300;
      Img.Top:= i * 150 + 10;
      Img.Stretch:= True;
      Img.Parent:=ScrollBox1;
    end;
  finally
    Nombres.Free;
  end;
end;
Al finalizar, también deberías eliminar los TImage que se han creado.

Saludos.

ingmichel 01-06-2011 03:17:13

muchisimas gracias ecfisa
 
hola ecfisa muchisimas gracias por tu respuesta, me haz salvado la vida, probe tu codigo y funciono perfecto, solo una inquietud como elimino los timage que se crean con el bucle ?

ecfisa 01-06-2011 05:43:39

Hola ingmichel.

Una forma podría ser mediante un TObjectList:
Código Delphi [-]
...

uses JPeg, ExtCtrls, Contnrs;

var
  ObjList: TObjectList;

...

procedure TForm1.btnCargarImagenesClick(Sender: TObject);
var
  Nombres: TStrings;
  Img: TImage;
  i: Integer;
begin
  if not Assigned(ObjList) then
  begin
    ObjList:= TObjectList.Create;
    Nombres:= TStringList.Create;
    try
      LeerJPGS('C:\Users\Oz\Pictures',Nombres);
      for i:= 0 to Nombres.Count -1 do
      begin
        Img:= TImage.Create(Self);
        ObjList.Add(Img);
        with TImage(ObjList[i]) do
        begin
          Picture.LoadFromFile(Nombres[i]);
          Height:= 150;
          Width:= 300;
          Top:= i * 150 + 10;
          Stretch:= True;
          Parent:= ScrollBox1;
        end;     
      end;
    finally
      Nombres.Free;
    end;
  end;
end;

...

procedure TForm1.btnLiberarImagenesClick(Sender: TObject);
begin
  if Assigned(ObjList) then
    ObjList.Free;
end;

Saludos.

ingmichel 01-06-2011 18:04:19

gracias
 
muchas gracias ecfisa por tu respuesta. dios te bendiga.


saludos.

ingmichel 03-06-2011 02:33:38

saludos ecfisa
 
saludos ecfisa como estas, espero que bien. bueno la razon de este mensaje es que tengo un pequeño inconveniente, resulta que me pidieron que las imagenes no se muestren todas de una sola vez, si no que se muestren una por una y tener dos botones(Siguiente y anterior) para ir navegando por las imagenes, mi duda es, como puedo modificar el codigo k me facilitaste para lograrlo ? y ademas que el componente timage adopte el ancho y el alto de la imagen que se esta leyendo ?

por favor ayudame...

gracias de antemano.

rrf 04-06-2011 18:06:54

Hola.

Aunque no estoy seguro, creo que la forma en la que lo resolvió ecfisa no servirá para las nuevas condiciones que has añadido en tu consulta.

Te propongo una estrategia alternativa utilizando un TFileListBox, 2 botones, 1 TOpenPictureDialog y 1 TImage.

Este es el código. Lo he probado en Delphi 7 y va bien. Creo que resuelve todas las condiciones que necesitas.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtDlgs, FileCtrl, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    FileListBox1: TFileListBox;
    OpenPictureDialog1: TOpenPictureDialog;
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
                       
  Posicion : Integer ;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin

  if OpenPictureDialog1.Execute then
  begin
    FileListBox1.Directory := ExtractFilePath( OpenPictureDialog1.FileName ) ;
    FileListBox1.Mask := '*.jpg' ;
    FileListBox1.Update ;

    Image1.Picture.LoadFromFile( FileListBox1.Items [0] );
    Posicion := 0 ;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  if Sender = Button1
    then Posicion := Posicion -1    // Button1 ---> Imagen anterior
    else Posicion := Posicion +1 ;  // Button2 ---> Imagen siguiente

  if Posicion < 0                  // Evita exceder límites
    then Posicion := 0 ;
  if Posicion > FileListBox1.Items.Count -1
    then Posicion := FileListBox1.Items.Count -1 ;

  Image1.Picture.LoadFromFile( FileListBox1.Items [ posicion ] );

  Image1.Width :=  Image1.Picture.Width ;       // Ajusta ancho y alto
  Image1.Height := Image1.Picture.Height ;

end;

end.

Usé el TOpenPictureDialog porque supuse que era posible que la carpeta con los archivos JPG puede ser cambiar.

En el TFileListBox, le pones Visible en False para que no lo vean los usuarios.

Espero que te sirva.

Saludos ;)

ecfisa 04-06-2011 19:30:19

Hola.

Otra alternativa es cargar todas las imágenes de una carpeta en algun punto de tu código e ir mostrándolas.
En el código de ejemplo que te adjunto se cargan de forma fija en el evento OnShow, pero podrías elegir la carpeta por otro medio.
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls, Contnrs;

type
  TForm1 = class(TForm)
    Image1: TImage;
    btSiguiente: TButton;
    btAnterior: TButton;
    procedure FormShow(Sender: TObject);
    procedure btSiguienteClick(Sender: TObject);
    procedure btAnteriorClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FPtr: Integer;  // Apuntador a imágen actual
    FObjLst: TObjectList;
    procedure LeerJPGS(const Ruta: string);
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}


uses JPeg;

procedure TForm1.LeerJPGS(const Ruta: string);
var
  SR: TSearchRec;
  Img: TImage;
begin
  if FindFirst(Ruta+'\*.JPG',faArchive, SR) = 0 then
  begin
    repeat
      Img:= TImage.Create(Self);
      Img.Picture.LoadFromFile(Ruta+'\'+SR.Name);
      FObjLst.Add(Img);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  FPtr:= 0;  
  FObjLst:= TObjectList.Create;
  LeerJPGS('C:\Users\Usuario\Pictures');
  Image1.Stretch:= True;
  Image1.Picture:= TImage(FObjLst.Items[FPtr]).Picture; // mostrar 1ra
end;

procedure TForm1.btSiguienteClick(Sender: TObject);
begin
  if FPtr < FObjLst.Count then Inc(FPtr);
  Image1.Picture:= TImage(FObjLst.Items[FPtr]).Picture;
  
end;

procedure TForm1.btAnteriorClick(Sender: TObject);
begin
  if FPtr > 0 then Dec(FPtr);
  Image1.Picture:= TImage(FObjLst.Items[FPtr]).Picture;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(FObjLst) then
    FObjLst.Free;
  Action:= caFree;
end;

end.

Saludos.

ingmichel 06-06-2011 05:16:15

muchas gracias
 
muchas gracias colegas por su ayuda, les comento que esta tarde investigando un poco en google encontre un componente llamado TImageen que es mucho mas potente que el Ttimage nativo de delphi, utilizando la funcion leerimagen de ecfisa para cargar las imagenes, el control tImage en view las carga tal cual yo lo requero y en uno de los ejemplos del componente me presenta las opciones de navegacion asi como tambien que las imagenes se carguen con su tamaño original, no se si ustedes estan de acuerdo con el uso de componentes de terceros pero veo k este me ha facilitado la vida, bueno muchas gracias y cualquier cosa vuelvo otra vez con mis dudas.

saludos.


La franja horaria es GMT +2. Ahora son las 18:01:25.

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