Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   consulta de imagen (https://www.clubdelphi.com/foros/showthread.php?t=86388)

edwin.simon 31-07-2014 19:21:28

consulta de imagen
 
Buena tarde, Estoy haciendo una captura de Registro en la cual agrego una foto.bmp y grabo la dirección de dicha foto, pero cuando quiero hacer una consulta ya sea por un navegador o un edit, no logro visualizar la foto, la pregunta es como puedo lograrlo.

para subir la foto uso el siguiente código
Código:

if (openPictureDialog1.Execute) then begin
          image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
          edit1.Text := OpenPictureDialog1.FileName;

y consulta los registro en un edit con este codigo
Código:

if Edit2.Text <> '' then
                Tbl_Fotos.Locate('Codigo_Imagen', Edit2.Text, [])
              else
                Abort;

y grabo la dirección de la foto así
Código:

if Tbl_Fotos.State in [dsedit, dsinsert] then
        Tbl_FotosImagen.Value := Edit1.Text;
        Tbl_Fotos.Post;

puedo decir que es buscando esta consulta en el foro pero no la encuentro, mil gracias

radenf 31-07-2014 23:20:17

Para visualizar la foto (en formato bmp) deberías utilizar un TDBImage conectado a tu BD a través de un TDataSource.
Salu2

ecfisa 01-08-2014 01:16:26

Hola edwin.simon

Como te menciona randenf la presentación de una imágen tipo bmp, si está almacenada físicamente en una tabla, es muy simple mediante un TDBImage .

Pero si deseas usar la ruta a la imágen, te pongo un ejemplo genérico de como podes implementarlo:
Código Delphi [-]
...
implementation

var
  Cod: Integer = 1;

// Mostrar al desplazarse
procedure TForm1.Tbl_FotosAfterScroll(DataSet: TDataSet);
begin
  with Tbl_Fotos.FieldByName('Imagen') do
    if not IsNull then
      Image1.Picture.LoadFromFile(AsString);
end;

// Agregar imágen
procedure TForm1.btnAddPictureClick(Sender: TObject);
begin
  with Tbl_Fotos do
  begin
    if OpenDialog1.Execute then
    begin
      Append;
      FieldByName('Codigo_Imagen').AsString:= Format('%.4d', [Cod]);
      FieldByName('Imagen').AsString:= OpenDialog1.FileName;
      Post;
      Inc(Cod);
    end;
  end;
end;

// Buscar registro x código - mostrar imágen
procedure TForm1.btnFindClick(Sender: TObject);
begin
  if Tbl_Fotos.Locate('Codigo_Imagen',Edit1.Text,[]) then
    Image1.Picture.LoadFromFile(Tbl_Fotos.FieldByName('Imagen').AsString);
end;
La conveniencia de almacenar físicamente la imágen o la ruta a la misma es un tema muy controversial.
Como muestra, se trata en este hilo: consejo para mostrar y guardar imagenes. Buscando en profundidad vas a encontrar mas material para que puedas decidir la mejor opción para tu caso.

Saludos :)

edwin.simon 01-08-2014 13:38:14

mucha gracias por la información rafenf y ecfisa
ECFISA, lei el debate que hay con relación a donde guardar la imagen super interesante, pudo decirte que en la actualidad almaceno la foto en la base de dato usando un DBImage, el problema es que esta muy pesada porque tengo 4300 registro y cada registro tiene una foto si pudiera hacer que se moviera mas rápida fuera un éxito.

si hay otra forma de mejorar el movimiento de la BD, para mi fuera lo mejor.

ecfisa 02-08-2014 23:03:23

Hola edwin.simon
Cita:

Empezado por edwin.simon (Mensaje 479600)
... pudo decirte que en la actualidad almaceno la foto en la base de dato usando un DBImage, el problema es que esta muy pesada porque tengo 4300 registro y cada registro tiene una foto si pudiera hacer que se moviera mas rápida fuera un éxito.

si hay otra forma de mejorar el movimiento de la BD, para mi fuera lo mejor.

La solución obvia es usar otro formato que mapa de bits para almacenar las imágenes. Para denotar la diferencia, una misma imágen de 1920x1200 píxeles ocupa:
Código:

Formato BMP (24 bits) = 6.912.054 bytes
Formato JPG          =  495.616 bytes

Pero, si almacenas imágenes JPG no podrás usar un TDBImage para mostrarlas, aunque podes usar un TImage en su lugar.

Un ejemplo básico:
Código Delphi [-]
implementation

uses Jpeg;
...
var
  Cont: Integer = 1;

// TImage a TBlobField
procedure ImageToField(aImage: TImage; aField: TField);
begin
  if aImage.Picture.Graphic is TJPEGImage then
  begin
    aField.DataSet.Edit;
    aField.Assign(aImage.Picture.Graphic);
  end;
end;

// TBlobField a TImage
procedure FieldToImage(aField: TField; aImage: TImage);
var
  J: TJPEGImage;
begin
  aImage.Picture:= nil;
  if (aField is TBlobField) then
    if not aField.IsNull then
    begin
      J:= TJPEGImage.Create;
      try
        J.Assign(aField);
        aImage.Picture.Assign(J);
      finally
        J.Free;
      end;
    end;
end;

// Agregar una imágen
procedure TForm1.btnAddImageClick(Sender: TObject);
begin
  with OpenDialog1 do
  begin
    if Execute then
    begin
      Image1.Picture:= nil;
      Image1.Picture.LoadFromFile(FileName);
      IBDataSet1.Insert;
      IBDataSet1.FieldByName('ID').AsInteger:= Cont;
      ...
      ImageToField(Image1,IBDataSet1.FieldByName('IMAGEN'));
      IBDataSet1.Post;
      Inc(Cont);
    end;
  end;
end;

// Mostrar imágen al desplazarse
procedure TForm1.IBDataSet1AfterScroll(DataSet: TDataSet);
begin
  FieldToImage(IBDataSet1.FieldByName('BLOB1'),Image1);
end;
...

Saludos :)

radenf 03-08-2014 19:06:44

Otra alternativa a lo que propone ecfisa.
Existe un componente gratuito que permite visualizar imágenes Jpeg guardadas en la base datos, sin añadir código.
EDBimage de Sebastián Mayora. La versión para Delphi 7 se encuentra disponible en la web de Embarcadero.
Trae el código fuente que permite adaptarlo para otras versiones de Delphi. Yo la utilizo con Delphi 2007 y XE3 y funciona sin problemas.

Saludos


La franja horaria es GMT +2. Ahora son las 14:59:23.

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