• Domingo 22 de Diciembre de 2024, 12:56

Autor Tema:  Cargar una imagen JPG de una base de datos a un TImage  (Leído 4318 veces)

Ana_22

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Cargar una imagen JPG de una base de datos a un TImage
« en: Jueves 18 de Marzo de 2010, 15:52 »
0
HOla Gente. Mi problema es que no puedo cargar una imagen JPG, que se encuentra en una base de datos(Firebird), en un componente TImagen.
Si la imagen es Bmp, lo puedo hacer con esta línea de código Image1->Picture->Assign(IBQuery1->FieldByName("FOTO")), sin problema. Pero si la imagen es JPG, me tira error. El campo FOTO es BLOB.

Si alguien me puede ayudar, se lo agradecería MUCHO.

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: Cargar una imagen JPG de una base de datos a un TImage
« Respuesta #1 en: Lunes 22 de Marzo de 2010, 23:21 »
0
El tema fue comentado hace un tiempo:
http://www.solocodigo.com/foros/viewtop ... 16&t=32584

Puede funcionar con esto:
Código: Text
  1.  
  2.  #include <jpeg.hpp> //Libreria para lo que ya imaginas
  3. ...
  4.  TJPEGImage *J = new TJPEGImage;
  5.  J->LoadFromFile( <imagen IBQuery >  ); //¿?
  6.  Image1->Picture->Assign(J);
  7.  
  8.  

Revisa el link, de todas maneras.
¿Porqué no usas el componente 'TDBImage' y te quitas de problemas? o quiza no te estoy entendiendo bien :rolleyes:
Pero el caso es que <jpeg.hpp> puede resolver tu problema.
Suerte.

Ana_22

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Cargar una imagen JPG de una base de datos a un TImage
« Respuesta #2 en: Martes 23 de Marzo de 2010, 13:08 »
0
Muchas Gracias por tu respuesta. No puedo usar un TDBImage porque sólo acepta imagenes bmp. Probé con el código que pusiste y con el código que había en el otro foro; pero creo q eso sirve para cuándo tenés la imagen en el disco, pero yo tengo la imagen en la base de datos.

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: Cargar una imagen JPG de una base de datos a un TImage
« Respuesta #3 en: Miércoles 24 de Marzo de 2010, 06:30 »
0
Lo siento. No era tan sencillo como pense. :brickwall:
Necesitas usar "streams".
En la parte de tu proyecto que creas que es pertinente, te puede ayudar este código:
Código: Text
  1.  
  2.  //Crear un Stream:
  3.  std::auto_ptr<TMemoryStream> stream (new TMemoryStream);
  4.  
  5.  tablaCAMPO_IMAGEN->SaveToStream(stream.get());  //Copiarle la imagen que esta en el campo activo
  6.  
  7. //tablaCAMPO_IMAGEN es un 'TField' o más bien un 'TBlobField' que se crea automáticamente cuando configuras el editor de campos (Field Editor)
  8.  
  9.  //  Creas una variable de tipo "jpg" (en este ejemplo la llamamos 'jpeg')
  10.  //  y posteriormente le asignas el "stream"
  11.  stream->Position   =   0;
  12.  std::auto_ptr<TJPEGImage>  jpeg(new   TJPEGImage);
  13.  jpeg->LoadFromStream(stream.get());
  14.  
  15.  //  'Image1' captura la imagen del 'jpeg'
  16.  Image1->Picture->Bitmap->Assign( jpeg.get() );
  17.  
  18.  
Quizá se complique un poco si en la BD tienes revueltas imagenes BMP y JPG, pero creo que la sentencia 'try' lo puede solucionar.

Mi Fuente es:
http://topic.csdn.net/t/20030523/12/1823767.html

Y muchas gracias por aclararme algunas dudas que tenía con este tema :rolleyes: :beer:

Saludos y suerte con tu proyecto. :good:

Ana_22

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Cargar una imagen JPG de una base de datos a un TImage
« Respuesta #4 en: Lunes 29 de Marzo de 2010, 17:18 »
0
GRACIAS TROD! Probé el código y andubo! :D . Pero todavía tengo un problemita, yo uso un IBQuery  para consultar por los registros y un DBGrid para ver el resultado de la consulta, y la imagen no cambia aunque me vaya seleccionando otro registro de la consulta; siempre me muestra la primer imagen del primer registro de la consulta; a pesar de haber enlazado el Ttable con el IBQuery.
Será cuestión de seguir probando...

Saludos!

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: Cargar una imagen JPG de una base de datos a un TImage
« Respuesta #5 en: Martes 30 de Marzo de 2010, 05:25 »
0
El componente TDatasource al que estan asociados tu rejilla de datos y el 'Query',  contiene un evento llamado OnDataChange, el cual ocurrira cada vez que cambie el contenido de tu 'Query', inclusive, cuando avanze el 'puntero' o 'cursor' del registro actual. Puedes aprovecharlo para "refrescar" la imagen con el contenido de tablaCAMPO_IMAGEN-> ... etc. etc. como en el código ejemplo anterior.

Saludos y que tengas un buen día  :comp:
:hola:

Ana_22

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Cargar una imagen JPG de una base de datos a un TImage
« Respuesta #6 en: Miércoles 31 de Marzo de 2010, 17:21 »
0
Pude solucionar mi problema :D . En vez de usar un componente IBTable, usé el IBQuery que ya usaba para filtrar los registros q me interesan, le hice clic derecho encima, y en la opción FieldsEditor, aparece una nueva ventanita, donde volví a hacer click derecho y elegí la opción AddField, elijo el campo que necesito, en este caso Foto; y ya me quedó mi TBlobField (IBQuery1FOTO), que luego uso en el código q me pasaste.
.
.
.
IBQuery1FOTO->SaveToStream(stream.get());
.
.
.

El código lo puse en el evento OnDataChange de IBQuery, para q se actualice la foto cada vez que cambio de registro en el DBStringGrid.

Otra vez Gracias por tu ayuda.