DBImage & Firebird: error in showing image from BLOB field lazarus / 16-Databases ---------------------------------------------------------------------- rretamar · 2018-02-27 22:07 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][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure TForm1.LoadImageButton1Click(Sender: TObject);begin  ExampleTable.Edit;  DBImage1.WriteHeader:= False;  DBImage1.Picture.LoadFromFile( FileNameEdit1.FileName ); // And call to POST event to save the changes in registryend;   This is the code for the sample Firebird 2.5 database (one field  ): Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i CREATE TABLE EXAMPLE (    MY_IMAGE  BLOB SUB_TYPE 0 SEGMENT SIZE 80); 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][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure TForm1.LoadImageButton1Click(Sender: TObject);begin  ExampleTable.Edit;  DBImage1.WriteHeader:= False;  DBImage1.Picture.LoadFromFile( FileNameEdit1.FileName ); // Y luego uso POST para guardar los cambiosend;   Este es el código para la tabla Firebird 2.5 (un solo campo !!!  ): Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i CREATE TABLE EXAMPLE (    MY_IMAGE  BLOB SUB_TYPE 0 SEGMENT SIZE 80); 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 ---------------------------------------------------------------------- GAN · 2018-02-27 22:55 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. ---------------------------------------------------------------------- rretamar · 2018-02-27 22:59 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 · 2018-02-28 02:59 Quote from: GAN on February 27, 2018, 11:55:55 pmHola 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 · 2018-02-28 04:01 Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure TfrmBancos.CargoEdit;var  unstream:TMemoryStream;begin  edNombre.Text:=DMBcos.ZQBancos.FieldByName('nombre').AsString;  edSucursal.Text:=DMBcos.ZQBancos.FieldByName('sucursal').AsString;  //y otros campos...  if DMBcos.ZQBancos.FieldByName('logo').IsNull then //si no hay imagen en la tabla     begin      Logotipo.Picture.Clear;      Exit;    end;  unstream:=TMemoryStream.Create;  unstream.Position:=0;  TBlobField(DMB cos.ZQBancos.FieldByName('logo')).SaveToStream(unstream);  unstream.Position:=0;  Logotipo.Picture.LoadFromStream(unstream);  unstream.Free;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][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i procedure TfrmBancos.btnAplicaClick(Sender: TObject);var  ms:TMemoryStream;begin  if bAgrega then DMBcos.ZQBancos.Insert else  DMBcos.ZQBancos.Edit;  DMBcos.ZQBancos.FieldByName('nombre').AsString:=edNombre.Text;  DMBcos.ZQBancos.FieldByName('sucursal').AsString:=edSucursal.Text;  //y otros campos...  if (logotipo.Picture.Width>0) then //Si se cargó una imagen    begin        ms:=TMemoryStream.Create;        Logotipo.Picture.SaveToStream(ms);        ms.Position:=0;        TBlobField(DMBcos.ZQBancos.FieldByName('logo')).LoadFromStream(ms);      ms.Free;    end  else    begin      DMBcos.ZQBancos.FieldByName('logo').AsString:='';    end;  DMBcos.ZQBancos.Post;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. ---------------------------------------------------------------------- rretamar · 2018-02-28 22:09 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.