Recent

Author Topic: DBImage & Firebird: error in showing image from BLOB field  (Read 4218 times)

rretamar

  • New Member
  • *
  • Posts: 39
DBImage & Firebird: error in showing image from BLOB field
« on: February 27, 2018, 11:07:45 pm »
Hi.
I have a very simple test firebird 2.5 database, with a BLOB binaty field (type 0, size 80).

In a test form place a DBImage component, and add a single code to load a image (BMP or JPG) from file. The code work without error, but when run the application again (with blob field with image content, at open table display error 'EinvalidGraphic' with message "Unknown picture format".

I using this code to load picture into blob field using dbimage component:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.LoadImageButton1Click(Sender: TObject);
  2. begin
  3.   ExampleTable.Edit;
  4.   DBImage1.WriteHeader:= False;
  5.   DBImage1.Picture.LoadFromFile( FileNameEdit1.FileName );
  6.  // And call to POST event to save the changes in registry
  7. end;
  8.  
  9.  

This is the code for the sample Firebird 2.5 database (one field  :D ):

Code: Pascal  [Select][+][-]
  1. CREATE TABLE EXAMPLE (
  2.     MY_IMAGE  BLOB SUB_TYPE 0 SEGMENT SIZE 80
  3. );

I test with BMP and JPG images, and fail in both cases when run the app for display image in dbimage component.

Any idea ?

In Spanish (sorry by my poor english):

Hola.
Tengo un problema con una base dedatos Firebird 2.5 que contiene un campo de tipo BLOB binario (tipo 0, longitud 80).

En un formulario de pruebas, coloco (ademas de los componentes para acceso a la base de datos) un componente DBImage, y el código para agregar una imagen en formato BMP o JPG desde un archivo. Funciona bien al leer el archivo y guardarlo en el campo, pero al ejecutar nuevamente la aplicación, cuando tienen que mostrar la imagen en el componente DBImage, se produce el error: 'EinvalidGraphic' con el mensaje "Unknown picture format".

Este es el código que uso para cargar la imagen desde un fichero:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.LoadImageButton1Click(Sender: TObject);
  2. begin
  3.   ExampleTable.Edit;
  4.   DBImage1.WriteHeader:= False;
  5.   DBImage1.Picture.LoadFromFile( FileNameEdit1.FileName );
  6.  // Y luego uso POST para guardar los cambios
  7. end;
  8.  
  9.  

Este es el código para la tabla Firebird 2.5 (un solo campo !!!  :D ):

Code: Pascal  [Select][+][-]
  1. CREATE TABLE EXAMPLE (
  2.     MY_IMAGE  BLOB SUB_TYPE 0 SEGMENT SIZE 80
  3. );

Hice la prueba con archivos BMP y JPG, en ambos casos se guardan (y en ese momento se muestran en el componente DBImage) , pero al intentar ejecutar de nuevo la aplicación, recibo un mensaje de error desde DbImage.

Ramon
« Last Edit: February 27, 2018, 11:14:37 pm by rretamar »

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: DBImage & Firebird: error in showing image from BLOB field
« Reply #1 on: February 27, 2018, 11:55:55 pm »
Hola Ramón, hace poco estuve luchando con DBImage, si la imagen no era JPG no le gustaba, lo solucioné con un TImage. Lo escribí aquí https://lazarus-freepascal.blogspot.com.ar/2018/02/guardar-y-leer-imagenes-en-bases-de.html por ahí te sirve como guía.

Saludos.
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

rretamar

  • New Member
  • *
  • Posts: 39
Re: DBImage & Firebird: error in showing image from BLOB field
« Reply #2 on: February 27, 2018, 11:59:34 pm »
Muchas gracias por responder. No puedo hacer funcionar DBImage con NINGUN formato: ni JPG, ni BMP, ni PNG. Hay algo que se me está escapando.

Gracias por el dato, le daré una mirada.

Saludos!

rretamar

  • New Member
  • *
  • Posts: 39
Re: DBImage & Firebird: error in showing image from BLOB field
« Reply #3 on: February 28, 2018, 03:59:04 am »
Hola Ramón, hace poco estuve luchando con DBImage, si la imagen no era JPG no le gustaba, lo solucioné con un TImage. Lo escribí aquí https://lazarus-freepascal.blogspot.com.ar/2018/02/guardar-y-leer-imagenes-en-bases-de.html por ahí te sirve como guía.

Saludos.

Hola.
Hice un test con ese código, guardo una imagen JPG en un campo BLOB y luego al intentar recuperarla en el objeto Timage recibo el error "Image with unknown compression".

GAN

  • Sr. Member
  • ****
  • Posts: 370
Re: DBImage & Firebird: error in showing image from BLOB field
« Reply #4 on: February 28, 2018, 05:01:10 am »
Code: Pascal  [Select][+][-]
  1. procedure TfrmBancos.CargoEdit;
  2. var
  3.   unstream:TMemoryStream;
  4. begin
  5.   edNombre.Text:=DMBcos.ZQBancos.FieldByName('nombre').AsString;
  6.   edSucursal.Text:=DMBcos.ZQBancos.FieldByName('sucursal').AsString;
  7.   //y otros campos...
  8.   if DMBcos.ZQBancos.FieldByName('logo').IsNull then //si no hay imagen en la tabla
  9.     begin
  10.       Logotipo.Picture.Clear;
  11.       Exit;
  12.     end;
  13.   unstream:=TMemoryStream.Create;
  14.   unstream.Position:=0;
  15.   TBlobField(DMBcos.ZQBancos.FieldByName('logo')).SaveToStream(unstream);
  16.   unstream.Position:=0;
  17.   Logotipo.Picture.LoadFromStream(unstream);
  18.   unstream.Free;
  19. end;

Este código funciona, con SQLite y ZeosLib, tanto en Linux como en Windows XP/7. Si hay una imagen en el campo 'logo' la carga.
Logotipo: TImage;
A lo mejor la imagen no se está guardando bien en el campo de tu tabla, que debe ser BLOB.
Con este procedimiento guardo la imagen:

Code: Pascal  [Select][+][-]
  1. procedure TfrmBancos.btnAplicaClick(Sender: TObject);
  2. var
  3.   ms:TMemoryStream;
  4. begin
  5.   if bAgrega then DMBcos.ZQBancos.Insert else  DMBcos.ZQBancos.Edit;
  6.   DMBcos.ZQBancos.FieldByName('nombre').AsString:=edNombre.Text;
  7.   DMBcos.ZQBancos.FieldByName('sucursal').AsString:=edSucursal.Text;
  8.   //y otros campos...
  9.   if (logotipo.Picture.Width>0) then //Si se cargó una imagen
  10.     begin
  11.         ms:=TMemoryStream.Create;
  12.         Logotipo.Picture.SaveToStream(ms);
  13.         ms.Position:=0;
  14.         TBlobField(DMBcos.ZQBancos.FieldByName('logo')).LoadFromStream(ms);
  15.         ms.Free;
  16.     end
  17.   else
  18.     begin
  19.       DMBcos.ZQBancos.FieldByName('logo').AsString:='';
  20.     end;
  21.   DMBcos.ZQBancos.Post;
  22. end;  

JPG y PNG funcionan bien, otro tipo no he probado.
Desconozco como se define un campo BLOB en Firebird, en SQLite simplemente es BLOB sin tamaño.

Saludos,
GAN.
« Last Edit: February 28, 2018, 05:02:51 am by GAN »
Lazarus 2.0.8 FPC 3.0.4 Linux Mint Mate 19.3
Zeos 7̶.̶2̶.̶6̶ 7.1.3a-stable - Sqlite 3.32.3 - LazReport

rretamar

  • New Member
  • *
  • Posts: 39
Re: DBImage & Firebird: error in showing image from BLOB field
« Reply #5 on: February 28, 2018, 11:09:41 pm »
Probé el mismo código pero en Firebird y se produce el mismo error. El campo donde guardo la imagen es un BLOB de tipo "binary" con longitud 80. Es raro, ví el ejemplo "Mushroom" que usa "Firebird embebido" (una versión monousuario similar a sqlite) y no debería fallar. Seguiré investigando, si encuentro la solución con Firebird la postearé aquí.

Edito: si uso una herramienta como SQL Manager for Firebird y agrego una imagen dentro del campo memo, la aplicación de prueba mía la muestra correctamente desde el componente DBImage. Entonces el problema es la forma en que la estoy insertando en la base de datos, que es incorrecta, y estoy intentando averiguar por qué (vengo desde Delphi).  %)

Saludos y gracias.
« Last Edit: March 01, 2018, 01:16:03 am by rretamar »

 

TinyPortal © 2005-2018