Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Guardar y cargar imagen en campo blob (https://www.clubdelphi.com/foros/showthread.php?t=77447)

look 26-01-2012 20:15:19

Guardar y cargar imagen en campo blob
 
Hola amigos, estoy tratando de guardar una imagen en un campo blob desde el componente timage,tambiem me gustaria saber como cargarla luego a ese timage...
¿Me hechan una mano?

Saludos

Caral 26-01-2012 21:29:17

Hola
Este código lo Hizo nuestro amigo ChackAll:
Esta hecho para ado (access), pero sera facil cambiarlo a IBX (firebird).
Código Delphi [-]
implementation

{$R *.dfm}

uses jpeg;

var jpg: TJPEGImage;

procedure TForm1.FormCreate(Sender: TObject);
begin
 jpg := TJPEGImage.Create;        // Creamos el objeto que "entiende" al JPEG

end;

// Guardar la foto en la tabla
procedure TForm1.Button1Click(Sender: TObject);
var bmp: TBitmap; Stream: TStream;
begin
 if not OpenDialog1.Execute then Exit;

 bmp := TBitmap.Create;           // Creamos el objeto que "entiende" al Bitmap
 bmp.LoadFromFile(OpenDialog1.FileName);  // cargamos la imagen
 jpg.Assign(bmp);                 // signamos la imagen BMP al objeto del JPEG
 bmp.Destroy;                     // y liberamos el objeto. }

 ADOTable1.Open;                  // Abrimos la tabla
 ADOTable1.Insert;                // Insertamos una nueva tupla
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmWrite); // Asignamos el BLOB a un stream
 jpg.SaveToStream(Stream);        // y guardamos la imagen como JPEG (convertido), en el stream
 Stream.Destroy;                  // liberamos.
 ADOTable1.Post;                // Guardamos.

end;

// cargar la foto de la tabla.
procedure TForm1.Button2Click(Sender: TObject);
var  Stream: TStream;
begin
 ADOTable1.Open;                 // Abrimos la tabla
 ADOTable1.Last;                 // Nos vamos a la última tupla para ver la ultima imagen añadida.
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmRead); // Lo mismo que el anterior caso pero ahora en modo de escritura.
 jpg.LoadFromStream(Stream);     // Cargamos el BLOB al objeto JPEG
 Stream.Destroy;                 // liberamos...
 Image2.Picture.Assign(jpg);     // y asignamos la imagen al TPicture.

 end;
Esta bien detallado, creo que se entiende bien.
Saludos

look 26-01-2012 21:36:35

Hola amigo , gracias por responder pero.... estoy utilizando consultas para guardar los datos...lo que pasa es que estoy modificando mi formulario de alta de articulos tratando de agregar la funcion de que el usuario pueda seleccionar una imagen para un producto, ya tengo todo el formulario muy funcional , pero este funciona con consultas para guardar la info... lo que me esta dando palos es guardar la imagen :(

Saludos!

Caral 26-01-2012 21:39:32

Hola
No entiendo amigo, el codigo que puse es lo que hace, guardar imagenes ??.
Saludos

look 26-01-2012 21:44:08

Cita:

Empezado por Caral (Mensaje 423784)
Hola
No entiendo amigo, el codigo que puse es lo que hace, guardar imagenes ??.
Saludos

si, pero utilizando tablas , necesito querys :p
por cierto , me da error en esta linea:
Código Delphi [-]
 bmp := TBitmap.Create;

Código:

object or class type requierd

Caral 26-01-2012 21:56:27

Hola
No entiendo la necesidad de un query si solo se va y actualiza un campo, que mas da ?.
Revisa este:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, DB, ADODB,  DBCtrls, ExtDlgs;

type
  TForm1 = class(TForm)
    Button2: TButton;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DBNavigator1: TDBNavigator;
    DataSource1: TDataSource;
    OpenPictureDialog1: TOpenPictureDialog;
    Button3: TButton;
    Image2: TImage;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses jpeg;

var jpg: TJPEGImage;

procedure TForm1.FormCreate(Sender: TObject);
Var BaseDeDatos, ConStr : String;

begin
   // Obtiene la ruta y el nombre de la base de datos
   BaseDeDatos := ExtractFilePath(Application.ExeName)+'xxx.MDB';
   If BasedeDatos = '' then ShowMessage('Error al cargar Base de Datos');
   ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
             'Data Source='+BaseDeDatos+';'+
             'Persist Security Info=False;'+
             'Jet OLEDB:Database Password=admin';
   ADOConnection1.ConnectionString := ConStr;
   ADOConnection1.Open;

 jpg := TJPEGImage.Create;        // Creamos el objeto que "entiende" al JPEG

end;

procedure TForm1.Button2Click(Sender: TObject);
var  Stream: TStream;
begin
 ADOTable1.Open;                 // Abrimos la tabla
 ADOTable1.Last;                 // Nos vamos a la última tupla para ver la ultima imagen añadida.
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmRead); // Lo mismo que el anterior caso pero ahora en modo de escritura.
 jpg.LoadFromStream(Stream);     // Cargamos el BLOB al objeto JPEG
 Stream.Destroy;                 // liberamos...
 Image2.Picture.Assign(jpg);     // y asignamos la imagen al TPicture.

 end;

procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
var  Stream: TStream;
begin
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmRead); // Lo mismo que el anterior caso pero ahora en modo de escritura.
 jpg.LoadFromStream(Stream);     // Cargamos el BLOB al objeto JPEG
 Stream.Destroy;                 // liberamos...
 Image2.Picture.Assign(jpg);     // y asignamos la imagen al TPicture.

end;

procedure TForm1.Button3Click(Sender: TObject);
var bmp: TBitmap; Stream: TStream;
begin
 if not OpenPictureDialog1.Execute then Exit;
 jpg.LoadFromFile(OpenPictureDialog1.FileName);
 ADOTable1.Open;                  // Abrimos la tabla
 ADOTable1.Insert;                // Insertamos una nueva tupla
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmWrite); // Asignamos el BLOB a un stream
 jpg.SaveToStream(Stream);        // y guardamos la imagen como JPEG (convertido), en el stream
 Stream.Destroy;                  // liberamos.
 ADOTable1.Post;
end;

end.
Saludos

genyus00 09-05-2016 00:46:33

Hola tengo una duda, respecto a la solucion dada.. En que formato se guarda la imagen en la base de datos? como una cadena stream o como una imagen?

AgustinOrtu 09-05-2016 01:14:15

Se guarda en formato binario plano o "raw"

No se puede guardar "como una imagen" :)

rastafarey 30-05-2016 14:31:49

Lo que se guarda en una imagen, asi de sencillo, que al guardarla la puedes transformar a .jpg o un formato de menor tamaño, por el tamaño y a la hora de recuperación no sea lento.

Enviado desde mi SM-G900H mediante Tapatalk

rmora03 25-07-2017 04:42:09

Cargar Imagen hacia tImage desde Base de datos
 
Cita:

Empezado por Caral (Mensaje 423781)
Hola
Este código lo Hizo nuestro amigo ChackAll:
Esta hecho para ado (access), pero sera facil cambiarlo a IBX (firebird).
Código Delphi [-]
implementation

{$R *.dfm}

uses jpeg;

var jpg: TJPEGImage;

procedure TForm1.FormCreate(Sender: TObject);
begin
 jpg := TJPEGImage.Create;        // Creamos el objeto que "entiende" al JPEG

end;

// Guardar la foto en la tabla
procedure TForm1.Button1Click(Sender: TObject);
var bmp: TBitmap; Stream: TStream;
begin
 if not OpenDialog1.Execute then Exit;

 bmp := TBitmap.Create;           // Creamos el objeto que "entiende" al Bitmap
 bmp.LoadFromFile(OpenDialog1.FileName);  // cargamos la imagen
 jpg.Assign(bmp);                 // signamos la imagen BMP al objeto del JPEG
 bmp.Destroy;                     // y liberamos el objeto. }

 ADOTable1.Open;                  // Abrimos la tabla
 ADOTable1.Insert;                // Insertamos una nueva tupla
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmWrite); // Asignamos el BLOB a un stream
 jpg.SaveToStream(Stream);        // y guardamos la imagen como JPEG (convertido), en el stream
 Stream.Destroy;                  // liberamos.
 ADOTable1.Post;                // Guardamos.

end;

// cargar la foto de la tabla.
procedure TForm1.Button2Click(Sender: TObject);
var  Stream: TStream;
begin
 ADOTable1.Open;                 // Abrimos la tabla
 ADOTable1.Last;                 // Nos vamos a la última tupla para ver la ultima imagen añadida.
 Stream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('photo'), bmRead); // Lo mismo que el anterior caso pero ahora en modo de escritura.
 jpg.LoadFromStream(Stream);     // Cargamos el BLOB al objeto JPEG
 Stream.Destroy;                 // liberamos...
 Image2.Picture.Assign(jpg);     // y asignamos la imagen al TPicture.

 end;
Esta bien detallado, creo que se entiende bien.
Saludos


Hola a Todos
Buscando una solución a mi problema, me encontré con este hilo. El procedimiento de guardar la imagen en el campo blob parece que lo hace sin problemas, sin embargo al tratar de obtener la imagen y asignarlo a un TImage me da problemas.
Estoy utilizando Delphi 5 con base de datos Firebird.
Les comparto el código

Procedimiento que guarda la Imagen:

procedure TfrmDetalleProducto.GuardarClick(Sender: TObject);
Var
tabla : tTable;
Stream: TStream;
bmp: TBitmap;
jpg : TJPEGImage;
begin
tabla := tTable.Create(nil);
tabla .DatabaseName := Sessions[0].Databases[0].DatabaseName;
tabla .TableName := 'Productos';
tabla .Active := True;
tabla.Insert;

jpg := TJPEGImage.Create;
bmp := TBitmap.Create;
bmp.LoadFromFile(Global.POS.FRutaImagenBtn + EdRutaImagen.text);
jpg.Assign(bmp);
bmp.Destroy;
Stream := tabla.CreateBlobStream(tabla.FieldByName('IMAGEN'), bmWrite);
jpg.SaveToStream(Stream);
Stream.Destroy;
tabla.post;
end;

Procedimiento para asignar la imagen al componente tImage
procedure TfrmDetalleProducto.CargarImagen(Sender: TObject);
Var
tabla : tTable;
Stream: TStream;
bmp: TBitmap;
jpg: TJPEGImage;
begin
tabla := tTable.Create(nil);
tabla .DatabaseName := Sessions[0].Databases[0].DatabaseName;
tabla .TableName := 'Productos';
tabla .Active := True;


If tabla.Locate('CODIGO',245,[loCaseInsensitive]) then
begin
jpg := TJPEGImage.Create;
Stream := tabla.CreateBlobStream(tabla.FieldByName('IMAGEN'), bmRead);
jpg.LoadFromStream(Stream); <------------ AQUI DA EL ERROR
Stream.Destroy;
bmp.Assign(jpg);
ImgProducto.Picture.Assign(bmp);
end;
end;

El error que despliega es: Project x.exe raised exception class EJPEG with message 'JPEG error #50'. Process stopped. Use Step or Run to continue.

Agradezco me puedan colaborar

Saludos

Casimiro Notevi 25-07-2017 10:07:31

Se supone que has añadido jpeg al uses:
Código:

uses jpeg;
Por cierto, bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

Y recuerda poner los tags al código fuente, ejemplo:



Gracias :)

rmora03 28-07-2017 21:58:17

Claro Casimiro, el uses del jpeg esta añadido.

Casimiro Notevi 28-07-2017 22:19:57

Puede que no sea un jpg, aunque su extensión sea jpg.

rmora03 29-07-2017 02:57:54

Cita:

Empezado por Casimiro Notevi (Mensaje 519830)
Puede que no sea un jpg, aunque su extensión sea jpg.

Claro yo mismo cree el archivo jpg.
Lo probé con un archivo bmp y otro jpg. Claro está que modifiqué el código para cada tipo de archivo.
No si tienes otra manera de hacerlo para intentarlo.

Saludos

Casimiro Notevi 29-07-2017 11:16:59

Desde aquí no podemos hacer mucho más, yo comprobaría con otro jpg, vaya a ser que ese esté mal.

GustavoCruz 03-08-2017 21:05:55

Intenta de esta manera
en el private
Código Delphi [-]
ms: TMemoryStream;

Para cargar la imagen
Código Delphi [-]
if AbreImagen.Execute then
  begin
    FotoUsuario.Picture.LoadFromFile(AbreImagen.FileName);
    ms := TMemoryStream.Create;
    try
      ms.Position := 0;
      FotoUsuario.Picture.SaveToStream(ms);
      FotoUsuario.Visible := True;
    except
      FotoUsuario.Picture := nil;
      ms.Free;
    end;
  end;

y esto para guardar

Código Delphi [-]
  
begin    
  try
    with qEjecutar do
    begin
      Close;
      SQL.Clear;
      SQL.Add('update or insert into protable(proidentidad, protipo, ' +
        'proclave, prousuario, pronombre, prodireccion, protelefono, ' +
        'proespecialidad, prorm, firma, procc, abrevia)values(''' +
        usIdentidad.Text + ''', ''' + IntToStr(usOpciones.ItemIndex) + ''', '''
        + usConfirmar.Text + ''', ''' + usUsuario.Text + ''', ''' +
        usNombres.Text + ''', ''' + usDireccion.Text + ''', ''' +
        usTelefonos.Text + ''', ' + Codigo_ESP + ', ' + rm + ', :l1, ''' +
        usIdentidad.Text + ''', ''' + usAbreviatura.Text +
        ''')matching(proidentidad, protipo)');
      ParamByName('l1').DataType := ftGraphic;
      ParamByName('l1').LoadFromStream(ms, ftGraphic);
      ExecSQL;
      fDatos.Transaccion.CommitRetaining;

      MsgBox(Titulo, 'Datos guardados satisfactoriamente...', mtInformation,
        ['Aceptar'], 0);
      Close;
    end;
  finally
    ms.Free;
  end;

Saludos...


La franja horaria es GMT +2. Ahora son las 12:16:17.

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