
Error en DBIMAGE
#1
Posted 04 May 2011 - 10:18 AM
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?
#2
Posted 04 May 2011 - 11:14 AM
var strArchivo: String; imagen: TPicture; begin if (OpenPictureDialog1.Execute) then begin imagen := TPicture.Create(); imagen.LoadFromFile(OpenPictureDialog1.FileName); DBImage1.Picture:= imagen; imagen.Free; end;
Saludos
#3
Posted 04 May 2011 - 11:34 AM
Sí, exactamente éste. La imagen se carga bien y aparece luego si hago un qwery desde mysql-qwery-browser la imagen está.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
var strArchivo: String; imagen: TPicture; begin if (OpenPictureDialog1.Execute) then begin imagen := TPicture.Create(); imagen.LoadFromFile(OpenPictureDialog1.FileName); DBImage1.Picture:= imagen; imagen.Free; end;
Saludos
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.
#4
Posted 04 May 2011 - 12:59 PM
Blob sub_type 0
No se como es el campo equivalente en MySql
¿Será que cuando la guardas empiezan los problemas?
#5
Posted 04 May 2011 - 04:17 PM
#6
Posted 05 May 2011 - 03:20 AM
#7
Posted 05 May 2011 - 07:38 AM
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:
FileName:= ReadLnS(S); //El fichero esta incrustado dentro... size:= ReadInteS(S); tmp:= TMemoryStream.create; try //No siempre esta sano el fichero! tmp.copyfrom(S, size); tmp.position:= 0; Tipo:= 1; //bmp por defecto... TipoTxt:= UpperCase(ExtractFileExt(FileName)); if TipoTxt='.JPG' then Tipo:= 2; if TipoTxt='.JPEG' then Tipo:= 2; if TipoTxt='.ICO' then Tipo:= 3; if TipoTxt='.WMF' then Tipo:= 4; if TipoTxt='.EMF' then Tipo:= 4; if TipoTxt='.PNG' then Tipo:= 5; case Tipo of 1: BitMap.BitMap.LoadFromStream(tmp); 2: begin BitMap.Graphic:= TJPEGImage.create; TJPEGImage(BitMap.Graphic).LoadFromStream(tmp); end; 3: BitMap.Icon.LoadFromStream(tmp); 4: BitMap.Metafile.LoadFromStream(tmp); 5: begin BitMap.Graphic:= TPNGObject.create; TPNGObject(BitMap.Graphic).LoadFromStream(tmp); end; 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.
#8
Posted 05 May 2011 - 09:58 AM
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
FileName:= ReadLnS(S); //El fichero esta incrustado dentro... size:= ReadInteS(S); tmp:= TMemoryStream.create; try //No siempre esta sano el fichero! tmp.copyfrom(S, size); tmp.position:= 0; Tipo:= 1; //bmp por defecto... TipoTxt:= UpperCase(ExtractFileExt(FileName)); if TipoTxt='.JPG' then Tipo:= 2; if TipoTxt='.JPEG' then Tipo:= 2; if TipoTxt='.ICO' then Tipo:= 3; if TipoTxt='.WMF' then Tipo:= 4; if TipoTxt='.EMF' then Tipo:= 4; if TipoTxt='.PNG' then Tipo:= 5; case Tipo of 1: BitMap.BitMap.LoadFromStream(tmp); 2: begin BitMap.Graphic:= TJPEGImage.create; TJPEGImage(BitMap.Graphic).LoadFromStream(tmp); end; 3: BitMap.Icon.LoadFromStream(tmp); 4: BitMap.Metafile.LoadFromStream(tmp); 5: begin BitMap.Graphic:= TPNGObject.create; TPNGObject(BitMap.Graphic).LoadFromStream(tmp); end; 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.....


#9
Posted 05 May 2011 - 11:36 AM
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.
uses pngimage, GIFImg, jpeg procedure TMainForm.UniDBGrid1CellClick(Column: TUniDBGridColumn); var m : TStream; FirstBytes: AnsiString; begin m := UniMainModule.ZTable1.CreateBlobStream(UniMainModule.ZTable1IMG, bmRead); if m <> nil then begin try SetLength(FirstBytes, 8); m.Read(FirstBytes[1], 8); if Copy(FirstBytes, 1, 2) = 'BM' then Image1.Picture.Graphic := TBitmap.Create else if FirstBytes = #137'PNG'#13#10#26#10 then Image1.Picture.Graphic := TPngImage.Create else if Copy(FirstBytes, 1, 3) = 'GIF' then Image1.Picture.Graphic := TGIFImage.Create else if Copy(FirstBytes, 1, 2) = #$FF#$D8 then Image1.Picture.Graphic := TJPEGImage.Create; try m.Seek(0,0); Image1.Picture.Graphic.LoadFromStream(m); finally m.Free; end; end; end;
Saludos.
#10
Posted 05 May 2011 - 03:58 PM
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
uses pngimage, GIFImg, jpeg procedure TMainForm.UniDBGrid1CellClick(Column: TUniDBGridColumn); var m : TStream; FirstBytes: AnsiString; begin m := UniMainModule.ZTable1.CreateBlobStream(UniMainModule.ZTable1IMG, bmRead); if m <> nil then begin try SetLength(FirstBytes, 8); m.Read(FirstBytes[1], 8); if Copy(FirstBytes, 1, 2) = 'BM' then Image1.Picture.Graphic := TBitmap.Create else if FirstBytes = #137'PNG'#13#10#26#10 then Image1.Picture.Graphic := TPngImage.Create else if Copy(FirstBytes, 1, 3) = 'GIF' then Image1.Picture.Graphic := TGIFImage.Create else if Copy(FirstBytes, 1, 2) = #$FF#$D8 then Image1.Picture.Graphic := TJPEGImage.Create; try m.Seek(0,0); Image1.Picture.Graphic.LoadFromStream(m); finally m.Free; end; end; 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.

#11
Posted 05 May 2011 - 07:01 PM
Luego va:
uses LazPNM, LazJPG, LazTGA, LazPNG, LazXPM, LazBMP;
Saludos
#12
Posted 06 May 2011 - 12:48 AM
¿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.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
uses LazPNM, LazJPG, LazTGA, LazPNG, LazXPM, LazBMP;
Saludos