Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-01-2012
Avatar de look
look look is offline
Miembro
 
Registrado: Sep 2007
Ubicación: Honduras-Altlantida-la Ceiba
Posts: 605
Poder: 12
look Va por buen camino
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
__________________
all your base are belong to us
Responder Con Cita
  #2  
Antiguo 26-01-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: Aug 2006
Posts: 7.659
Poder: 20
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 26-01-2012
Avatar de look
look look is offline
Miembro
 
Registrado: Sep 2007
Ubicación: Honduras-Altlantida-la Ceiba
Posts: 605
Poder: 12
look Va por buen camino
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!
__________________
all your base are belong to us
Responder Con Cita
  #4  
Antiguo 26-01-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: Aug 2006
Posts: 7.659
Poder: 20
Caral Va por buen camino
Hola
No entiendo amigo, el codigo que puse es lo que hace, guardar imagenes ??.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 26-01-2012
Avatar de look
look look is offline
Miembro
 
Registrado: Sep 2007
Ubicación: Honduras-Altlantida-la Ceiba
Posts: 605
Poder: 12
look Va por buen camino
Cita:
Empezado por Caral Ver Mensaje
Hola
No entiendo amigo, el codigo que puse es lo que hace, guardar imagenes ??.
Saludos
si, pero utilizando tablas , necesito querys
por cierto , me da error en esta linea:
Código Delphi [-]
 bmp := TBitmap.Create;

Código:
object or class type requierd
__________________
all your base are belong to us
Responder Con Cita
  #6  
Antiguo 26-01-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: Aug 2006
Posts: 7.659
Poder: 20
Caral Va por buen camino
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 OLEDBatabase 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
__________________
Siempre Novato
Responder Con Cita
  #7  
Antiguo 09-05-2016
genyus00 genyus00 is offline
Miembro
 
Registrado: Jun 2010
Posts: 25
Poder: 0
genyus00 Va por buen camino
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?
Responder Con Cita
  #8  
Antiguo 09-05-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: Aug 2013
Ubicación: Argentina
Posts: 1.858
Poder: 10
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Se guarda en formato binario plano o "raw"

No se puede guardar "como una imagen"
Responder Con Cita
  #9  
Antiguo 30-05-2016
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: Nov 2003
Posts: 927
Poder: 15
rastafarey Va por buen camino
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
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #10  
Antiguo 25-07-2017
rmora03 rmora03 is offline
Registrado
 
Registrado: Feb 2008
Posts: 7
Poder: 0
rmora03 Va por buen camino
Cargar Imagen hacia tImage desde Base de datos

Cita:
Empezado por Caral Ver Mensaje
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
Responder Con Cita
  #11  
Antiguo 25-07-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.596
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #12  
Antiguo 28-07-2017
rmora03 rmora03 is offline
Registrado
 
Registrado: Feb 2008
Posts: 7
Poder: 0
rmora03 Va por buen camino
Claro Casimiro, el uses del jpeg esta añadido.
Responder Con Cita
  #13  
Antiguo 28-07-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.596
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Puede que no sea un jpg, aunque su extensión sea jpg.
Responder Con Cita
  #14  
Antiguo 29-07-2017
rmora03 rmora03 is offline
Registrado
 
Registrado: Feb 2008
Posts: 7
Poder: 0
rmora03 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Responder Con Cita
  #15  
Antiguo 29-07-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.596
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Desde aquí no podemos hacer mucho más, yo comprobaría con otro jpg, vaya a ser que ese esté mal.
Responder Con Cita
  #16  
Antiguo 03-08-2017
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: Jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 270
Poder: 13
GustavoCruz Va por buen camino
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...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cargar imagen en Un TImage guardada en campo Blob o Objeto OLE en accsess gulder Varios 1 28-11-2008 18:54:43
guardar archivos en un campo blob a_f_g Firebird e Interbase 10 07-11-2008 20:46:28
Cargar imagen BLOB usando BDE leodenis784 Gráficos 3 12-09-2006 10:31:07
¿cargar un campo blob por codigo? fredo SQL 2 18-05-2005 14:56:59
guardar un fichero en un campo blob apicito Firebird e Interbase 2 02-03-2005 12:01:54


La franja horaria es GMT +2. Ahora son las 15:06:28.


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