Ir al contenido


Foto

Error en DBIMAGE


  • Por favor identifícate para responder
11 respuestas en este tema

#1 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 04 mayo 2011 - 10:18

Guenas:

Tengo un control DBImage apuntando a un campo de mySQL, he añadido una imagen al campo desde un OpenPictureDialog. Todo bien hasta que he salido del programa y he vuelto a entrar, ahora al intentar ejecutar la aplicación me da este error:

Invalid palette index 63.

El código que he usado lo he sacado de:
http://www.delphiacc...8760/#msg48760 :




¿Alguna ídea?


  • 0

#2 robert01

robert01

    Advanced Member

  • Miembros
  • PipPipPip
  • 162 mensajes
  • LocationArgentina

Escrito 04 mayo 2011 - 11:14

Hola ¿usaste el código con la correción que hizo Caral? Yo lo probé y andubo bien pero uso Firebird no se que puede pasar con MySql



delphi
  1. var
  2.   strArchivo: String;
  3.   imagen: TPicture;
  4. begin
  5.   if (OpenPictureDialog1.Execute) then
  6.   begin
  7.   imagen := TPicture.Create();
  8.   imagen.LoadFromFile(OpenPictureDialog1.FileName);
  9.   DBImage1.Picture:= imagen;
  10.   imagen.Free;
  11.   end;



Saludos

  • 0

#3 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 04 mayo 2011 - 11:34

Hola ¿usaste el código con la correción que hizo Caral? Yo lo probé y andubo bien pero uso Firebird no se que puede pasar con MySql



delphi
  1. var
  2.   strArchivo: String;
  3.   imagen: TPicture;
  4. begin
  5.   if (OpenPictureDialog1.Execute) then
  6.   begin
  7.   imagen := TPicture.Create();
  8.   imagen.LoadFromFile(OpenPictureDialog1.FileName);
  9.   DBImage1.Picture:= imagen;
  10.   imagen.Free;
  11.   end;



Saludos

Sí, exactamente éste. La imagen se carga bien y aparece luego si hago un qwery desde mysql-qwery-browser la imagen está.
El error lo da al cargar el form de nuevo en la ejecución del programa cuando se carga el registro que contiene la imágen.
  • 0

#4 robert01

robert01

    Advanced Member

  • Miembros
  • PipPipPip
  • 162 mensajes
  • LocationArgentina

Escrito 04 mayo 2011 - 12:59

Yo, en la base de datos, tengo definido el campo de la imagen como:

Blob sub_type 0

No se como es el campo equivalente en MySql
¿Será que cuando la guardas empiezan los problemas?


  • 0

#5 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 04 mayo 2011 - 04:17

El problema está al salir y volver a entrar al programa y recuperar un registro que contenga una imagen. Entonces es cuando me da el error.


  • 0

#6 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 05 mayo 2011 - 03:20

He probado a cargar un bmp en lugar de un jpg y no da el error, sin embargo la imagen no es correcta. Siendo un galimatías de líneas en lugar de la foto del paciente
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 05 mayo 2011 - 07:38

No es tan simple, al menos a mi no me funciono asi, yo almaceno el nombre del fichero y su longitud MAS el fichero, y la carga es diferente segun sea el tipo de fichero (si solo dejas cargas JPEG te ahorras muchos problemas).

Ademas, el JPEG no sabe darte su "size", solo lo sabes si lo guardas a stream o fichero.

Bueno, un poco de codigo va a ser lo mejor:



delphi
  1.     FileName:= ReadLnS(S);
  2.     //El fichero esta incrustado dentro...
  3.     size:= ReadInteS(S);
  4.     tmp:= TMemoryStream.create;
  5.     try //No siempre esta sano el fichero!
  6.       tmp.copyfrom(S, size);
  7.       tmp.position:= 0;
  8.       Tipo:= 1; //bmp por defecto...
  9.       TipoTxt:= UpperCase(ExtractFileExt(FileName));
  10.       if TipoTxt='.JPG'  then Tipo:= 2;
  11.       if TipoTxt='.JPEG' then Tipo:= 2;
  12.       if TipoTxt='.ICO'  then Tipo:= 3;
  13.       if TipoTxt='.WMF'  then Tipo:= 4;
  14.       if TipoTxt='.EMF'  then Tipo:= 4;
  15.       if TipoTxt='.PNG'  then Tipo:= 5;
  16.       case Tipo of
  17.         1: BitMap.BitMap.LoadFromStream(tmp);
  18.         2: begin
  19.             BitMap.Graphic:= TJPEGImage.create;
  20.             TJPEGImage(BitMap.Graphic).LoadFromStream(tmp);
  21.           end;
  22.         3: BitMap.Icon.LoadFromStream(tmp);
  23.         4: BitMap.Metafile.LoadFromStream(tmp);
  24.         5: begin
  25.             BitMap.Graphic:= TPNGObject.create;
  26.             TPNGObject(BitMap.Graphic).LoadFromStream(tmp);
  27.           end;
  28.       end;



Lo del ReadLnS(s) es una funcioncita mia para leer el nombre y el size, que yo guardo todo dentro de un mismo blob con el fichero en si (no tenia otra) pero tu puedes usar campos "normales" y te ahorras el stream tmp y esas cosas que ves en el codigo.
  • 0

#8 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 05 mayo 2011 - 09:58

No es tan simple, al menos a mi no me funciono asi, yo almaceno el nombre del fichero y su longitud MAS el fichero, y la carga es diferente segun sea el tipo de fichero (si solo dejas cargas JPEG te ahorras muchos problemas).

Ademas, el JPEG no sabe darte su "size", solo lo sabes si lo guardas a stream o fichero.

Bueno, un poco de codigo va a ser lo mejor:



delphi
  1.     FileName:= ReadLnS(S);
  2.     //El fichero esta incrustado dentro...
  3.     size:= ReadInteS(S);
  4.     tmp:= TMemoryStream.create;
  5.     try //No siempre esta sano el fichero!
  6.       tmp.copyfrom(S, size);
  7.       tmp.position:= 0;
  8.       Tipo:= 1; //bmp por defecto...
  9.       TipoTxt:= UpperCase(ExtractFileExt(FileName));
  10.       if TipoTxt='.JPG'  then Tipo:= 2;
  11.       if TipoTxt='.JPEG' then Tipo:= 2;
  12.       if TipoTxt='.ICO'  then Tipo:= 3;
  13.       if TipoTxt='.WMF'  then Tipo:= 4;
  14.       if TipoTxt='.EMF'  then Tipo:= 4;
  15.       if TipoTxt='.PNG'  then Tipo:= 5;
  16.       case Tipo of
  17.         1: BitMap.BitMap.LoadFromStream(tmp);
  18.         2: begin
  19.             BitMap.Graphic:= TJPEGImage.create;
  20.             TJPEGImage(BitMap.Graphic).LoadFromStream(tmp);
  21.           end;
  22.         3: BitMap.Icon.LoadFromStream(tmp);
  23.         4: BitMap.Metafile.LoadFromStream(tmp);
  24.         5: begin
  25.             BitMap.Graphic:= TPNGObject.create;
  26.             TPNGObject(BitMap.Graphic).LoadFromStream(tmp);
  27.           end;
  28.       end;



Lo del ReadLnS(s) es una funcioncita mia para leer el nombre y el size, que yo guardo todo dentro de un mismo blob con el fichero en si (no tenia otra) pero tu puedes usar campos "normales" y te ahorras el stream tmp y esas cosas que ves en el codigo.



Leñe que novato que soy.....  :cry: No entiendo casi nada,  :embarrassed: y eso que lo has puesto bien comentado. Podría limitarlo a un JPG o un GIF, me da igual.... ¿Hay algún formato de imagen que se pueda poner dentro de un campo blob y que no sea tanto lío?
  • 0

#9 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 05 mayo 2011 - 11:36

Creo haber compartido este procedimiento antes en el foro pero no encontré el post, jeje, el siguiente procedimiento recibe un blob, a partir del cual determina el tipo de imagen si es que lo es y prepara el componente TImage para desplegarla, lo he probado con firebird y funciona de maravilla con formatos bmp, jpg, gif y png, probado en delphi 2010 y XE.
Me disculpo si es que omití algún end, jeje lo he editado pues tenia validaciones por demás que no necesitarias, saludos.
Creo lo estas almacenando bien, el problema es el despliegue de tu blob.


delphi
  1. uses
  2. pngimage, GIFImg, jpeg
  3. procedure TMainForm.UniDBGrid1CellClick(Column: TUniDBGridColumn);
  4. var
  5.   m : TStream;
  6.   FirstBytes: AnsiString;
  7. begin
  8.       m := UniMainModule.ZTable1.CreateBlobStream(UniMainModule.ZTable1IMG, bmRead);
  9.     if m <> nil then begin
  10.     try
  11.         SetLength(FirstBytes, 8);
  12.         m.Read(FirstBytes[1], 8);
  13.         if Copy(FirstBytes, 1, 2) = 'BM' then
  14.           Image1.Picture.Graphic := TBitmap.Create
  15.       else
  16.       if FirstBytes = #137'PNG'#13#10#26#10 then
  17.           Image1.Picture.Graphic := TPngImage.Create
  18.       else
  19.       if Copy(FirstBytes, 1, 3) = 'GIF' then
  20.           Image1.Picture.Graphic := TGIFImage.Create
  21.       else
  22.       if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
  23.           Image1.Picture.Graphic := TJPEGImage.Create;
  24.       try
  25.         m.Seek(0,0);
  26.         Image1.Picture.Graphic.LoadFromStream(m);
  27.       finally
  28.         m.Free;
  29.       end;
  30.     end;
  31. end;



Saludos.
  • 0

#10 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 05 mayo 2011 - 03:58

Creo haber compartido este procedimiento antes en el foro pero no encontré el post, jeje, el siguiente procedimiento recibe un blob, a partir del cual determina el tipo de imagen si es que lo es y prepara el componente TImage para desplegarla, lo he probado con firebird y funciona de maravilla con formatos bmp, jpg, gif y png, probado en delphi 2010 y XE.
Me disculpo si es que omití algún end, jeje lo he editado pues tenia validaciones por demás que no necesitarias, saludos.
Creo lo estas almacenando bien, el problema es el despliegue de tu blob.


delphi
  1. uses
  2. pngimage, GIFImg, jpeg
  3. procedure TMainForm.UniDBGrid1CellClick(Column: TUniDBGridColumn);
  4. var
  5.   m : TStream;
  6.   FirstBytes: AnsiString;
  7. begin
  8.       m := UniMainModule.ZTable1.CreateBlobStream(UniMainModule.ZTable1IMG, bmRead);
  9.     if m <> nil then begin
  10.     try
  11.         SetLength(FirstBytes, 8);
  12.         m.Read(FirstBytes[1], 8);
  13.         if Copy(FirstBytes, 1, 2) = 'BM' then
  14.           Image1.Picture.Graphic := TBitmap.Create
  15.       else
  16.       if FirstBytes = #137'PNG'#13#10#26#10 then
  17.           Image1.Picture.Graphic := TPngImage.Create
  18.       else
  19.       if Copy(FirstBytes, 1, 3) = 'GIF' then
  20.           Image1.Picture.Graphic := TGIFImage.Create
  21.       else
  22.       if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
  23.           Image1.Picture.Graphic := TJPEGImage.Create;
  24.       try
  25.         m.Seek(0,0);
  26.         Image1.Picture.Graphic.LoadFromStream(m);
  27.       finally
  28.         m.Free;
  29.       end;
  30.     end;
  31. end;



Saludos.


Pues en lazarus no me acepta ninguno de los Uses que pones. No entiendo como algo tan banal como poner una imagen en un campo puede ser tan liado, debería ser más fácil. :cry:
  • 0

#11 robert01

robert01

    Advanced Member

  • Miembros
  • PipPipPip
  • 162 mensajes
  • LocationArgentina

Escrito 05 mayo 2011 - 07:01

Tenés que instalar Imagesforlazarus, vas a paquetes, abrir archivo de paquete (lpk) buscá en components, dentro hay una carpeta images y en esta, hay un archivo llamado images forlazarus.lpk, lo compilás e instalás.

Luego va:



delphi
  1. uses LazPNM, LazJPG, LazTGA, LazPNG, LazXPM, LazBMP;



Saludos

  • 0

#12 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 06 mayo 2011 - 12:48

Tenés que instalar Imagesforlazarus, vas a paquetes, abrir archivo de paquete (lpk) buscá en components, dentro hay una carpeta images y en esta, hay un archivo llamado images forlazarus.lpk, lo compilás e instalás.

Luego va:



delphi
  1. uses LazPNM, LazJPG, LazTGA, LazPNG, LazXPM, LazBMP;



Saludos

¿Y donde meto este uses?, porque si lo pongo al inicio del modulo me dice que no los encuentra y he comprobado que el paquete está bien instalado.
  • 0




IP.Board spam blocked by CleanTalk.