Hola.
Haber si me explico, utilizo el delphi 7 y tengo una campo en una base de datos longblob que almacena las imagenes en JPG (por supuesto no tengo esa imagen en el ordenador) y necesito parsar ese JPG a BMP y despues pasarlo a un TImage para verla en BMP.
Gracias.

convertir imagen JPG en BMP
Started by
diocles
, Jan 19 2015 10:36 AM
3 replies to this topic
#1
Posted 19 January 2015 - 10:36 AM
#2
Posted 19 January 2015 - 11:02 AM
Hola
pero, si usas la clase TJPG puedes abrir sin problema las imágenes sin necesidad de convertirlas de formato.
Saludos!!
pero, si usas la clase TJPG puedes abrir sin problema las imágenes sin necesidad de convertirlas de formato.
Saludos!!
#3
Posted 19 January 2015 - 12:13 PM
Basicamente necesitaras dos TImage, uno tipo JPEG (por lo que necesitas hacer uses de la unidad jpeg) y otro TImage receptor.
El TImege jpeg lo creas y cargas el contenido del blob a un TMemoryStream, y desde aqui lo lees en el TImage.JPEG.LoadFromStrem (es de memoria), y una vez leido, lo copias al otro con:
ImagenVisible.Picture.Assign(ImagenPEG.Picture);
De nuevo es de memoria, no se si se copiaba el picture o el bitmap, cosas de la edad!
El ImagenJPEG si te da problemas al ir leyendo imagen tras imagen, te tocara hacerle un free y volverlo a crear cada vez, en D7 la unit jpeg va regular algunas veces.
El TImege jpeg lo creas y cargas el contenido del blob a un TMemoryStream, y desde aqui lo lees en el TImage.JPEG.LoadFromStrem (es de memoria), y una vez leido, lo copias al otro con:
ImagenVisible.Picture.Assign(ImagenPEG.Picture);
De nuevo es de memoria, no se si se copiaba el picture o el bitmap, cosas de la edad!
El ImagenJPEG si te da problemas al ir leyendo imagen tras imagen, te tocara hacerle un free y volverlo a crear cada vez, en D7 la unit jpeg va regular algunas veces.
#4
Posted 20 January 2015 - 09:56 AM
Hola
En ciertas oportunidades no se desea utilizar componentes visuales y se requiere hacer todo por código, y definitivamente Delphi 7 no tiene las ventajas que tienen las nuevas versiones de Delphi y mucho menos FireMonkey en el caso de los gráficos.
Si lo que quieres es cargar un JPG directamente desde un Stream el código sería mas o menos esto:
Asumiendo que ya tienes la imagen en un stream.
Ya he realizado unas funciones en en Delphi 7 que detectan en un stream el tipo de imagen y luego otra que carga la imagen.
Función para detectar el tipo de imagen que hay en un stream.
Función que se encarga de carga la imagen de un stream
Espero sea de utilidad.
En ciertas oportunidades no se desea utilizar componentes visuales y se requiere hacer todo por código, y definitivamente Delphi 7 no tiene las ventajas que tienen las nuevas versiones de Delphi y mucho menos FireMonkey en el caso de los gráficos.
Si lo que quieres es cargar un JPG directamente desde un Stream el código sería mas o menos esto:
Asumiendo que ya tienes la imagen en un stream.
delphi
Var jp : TJPEGImage; Bm : TBitMap; Begin jp := TJPEGImage.Create; Bm := TBitMap.Create; Jp.LoadFromStream(Stream); Bm.Assing(Jp); End;
Ya he realizado unas funciones en en Delphi 7 que detectan en un stream el tipo de imagen y luego otra que carga la imagen.
Función para detectar el tipo de imagen que hay en un stream.
delphi
Function GetImageFormat(Stream : TStream) : String; Var FirstBytes: AnsiString; begin Result := ''; if (Stream <> nil) and (Stream.Size > 40) then begin try SetLength(FirstBytes, 8); Stream.Read(FirstBytes[1], 8); if Copy(FirstBytes, 1, 2) = 'BM' then Result := '.bmp' else if FirstBytes = #137'PNG'#13#10#26#10 then Result := '.png' else if Copy(FirstBytes, 1, 3) = 'GIF' then Result := '.gif' else if Copy(FirstBytes, 1, 2) = #$FF#$D8 then Result := '.jpg' else if Copy(FirstBytes, 1, 3) = #$49#$49#$2A then Result := '.tif' else if Copy(FirstBytes, 1, 3) = #$0#$0#$01 then Result := '.ico' Finally end; end; End;
Función que se encarga de carga la imagen de un stream
delphi
Function LoadGraphicFromStream(St : TStream) : TGraphic; var jp : TJPEGImage; //Requires the "jpeg" unit added to "uses" clause. bm : TBitmap; Mf : TMetaFile; Ic : TIcon; Gif : TGIFImage; png : TPngImage; Ext : String; Begin If Not Assigned(St) then Raise Exception.create('El formato de Imágen no es válida'); If St.Size < 40 then Raise Exception.create('El formato de Imágen no es válida'); Result := Nil; St.Position := 0; Ext := AnsiLowerCase(GetImageFormat(St)); If not ((ext = '.jpg') or (ext = '.jpeg') or (ext = '.bmp') or (ext = '.ico') or (ext = '.emf') or (ext = '.wmf') or (ext = '.gif') or (ext = '.png')) then Raise Exception.Create('El formato "'+Ext+'" del archivo no es soportado'); St.Position := 0; Try If (ext = '.jpg') or (ext = '.jpeg') then Begin jp := TJPEGImage.Create; Jp.LoadFromStream(St); Result := Jp; End Else If (ext = '.gif') then Begin Gif := TGIFImage.Create; Gif.LoadFromStream(St); Result := Gif; End Else If (ext = '.png') then Begin Png := TPngImage.Create; Png.LoadFromStream(St); Result := Png; End Else If (ext = '.ico') then Begin Ic := TIcon.Create; Ic.LoadFromStream(St); Result := Ic; End Else If (ext = '.emf') or (ext = '.wmf') then Begin Mf := TMetaFile.Create; Mf.LoadFromStream(St); Result := Mf; End Else If (ext = '.bmp') then Begin Bm := TBitMap.Create; Bm.LoadFromStream(St); Result := Bm; End Else Raise exception.create('El formato del archivo "'+Ext+'" no es soportado'); Finally End; End;
Espero sea de utilidad.