PDA

Ver la Versión Completa : Almacenamiento de Iágenes en Base de Datos


apicito
03-06-2004, 16:30:14
Utilizo Firebird 1.00 con componentes de acceso IBO 4. Estoy utilizando el siguiente procedimiento para cargar y visualizar las imagenes:

PARA CARGAR:
procedure TExp700.BotonCargar(Sender: TObject);
var
Jpg: TJpegImage;
Stream: TMemoryStream;
FileExt: string;
GraphType: TGraphType;
begin
if OpenPicture.Execute then
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
FileExt := LowerCase(ExtractFileExt(OpenPicture.FileName));
if (FileExt = '.bmp') or (FileExt = '.dib') then
begin
GraphType := gtBitmap;
Stream.Write(GraphType, 1);
with Imagen.Picture.Bitmap do
begin
LoadFromFile(OpenPicture.FileName);
Imagen.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.ico') then
begin
GraphType := gtIcon;
Stream.Write(GraphType, 1);
with Imagen.Picture.Icon do
begin
LoadFromFile(OpenPicture.FileName);
Imagen.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.emf') or (FileExt = '.wmf') then
begin
GraphType := gtMetafile;
Stream.Write(GraphType, 1);
with Imagen.Picture.Metafile do
begin
LoadFromFile(OpenPicture.FileName);
Imagen.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.jpg') or (FileExt = '.jpeg') or (FileExt = '.jpe') then
begin
Jpg := TJpegImage.Create;
Jpg.LoadFromFile(OpenPicture.FileName);
Imagen.Picture.Assign(Jpg);
GraphType := gtJpeg;
Stream.Write(GraphType, 1);
Jpg.SaveToStream(Stream);
end;
Stream.Position := 0;
TBlobField(QueryTra.FieldByName('EXPTRA_TEXTO')).LoadFromStream(Stream);
except
jpg.Free;
Stream.Free;
raise;
end;
jpg.Free;
Stream.Free;
end;
end;

PARA VISULIZAR

procedure TExp700.QueryTraAfterScroll(DataSet: TDataSet);
var
Stream: TMemoryStream;
Jpg: TJpegImage;
GraphType: TGraphType;
begin inherited;
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
TBlobField(QueryTra.FieldByName('EXPTRA_TEXTO')).SaveToStream(Stream);
if Stream.Size > 0 then
begin
Stream.Position := 0;
Stream.Read(GraphType, 1);
case GraphType of
gtBitmap: Imagen.Picture.Bitmap.LoadFromStream(Stream);
gtIcon: Imagen.Picture.Icon.LoadFromStream(Stream);
gtMetafile: Imagen.Picture.Metafile.LoadFromStream(Stream);
gtJpeg:
begin
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Imagen.Picture.Assign(Jpg);
end
else
Imagen.Picture.Assign(nil);
end;
end
else
Imagen.Picture.Assign(nil);
except
Showmessage('Non se poido');
Imagen.Picture.Assign(nil);
end;
jpg.Free;
Stream.Free;
end;

El procedimiento de carga funciona correctamente pero el de visualización no carga la imagen en "Imagen", que es un TImage. Llevo todo el día dandole vueltas y no consigo ver que es lo que falla. Me queda la sospecha de que este procedimiento solo funcione con el BDE, ya que en algún sitio he leido algo al respecto.
Alguien puede ayudarme?

guillotmarc
10-06-2004, 14:57:03
Hola.

Yo lo hago de forma similar con dbExpress y no tengo problemas. Por lo que no es que solo funcione con BDE. Además debería funcionar correctamente con IBO también, pero no puedo probarlo.

Comprueba con el depurador que se ejecuta correctamente todo el código, y si te sale algún error, dínos cual es y quizá te podamos ayudar.

Saludos.

apicito
11-06-2004, 08:34:53
Gracias por la respuesta pero ya tomé otro camino. Me pase una mañana entera intentando hacer funcionar esto y no hubo manera. Decidí comprar un componente (KDImage 59€) que además de automatizar esto permite retocar la imagen, girarla, etc..
En ocasiones los problemas son los que te llevan a las mejores soluciones.
Gracias de nuevo.