Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Almacenamiento de Iágenes en Base de Datos (https://www.clubdelphi.com/foros/showthread.php?t=11012)

apicito 03-06-2004 16:30:14

Almacenamiento de Iágenes en Base de Datos
 
Utilizo Firebird 1.00 con componentes de acceso IBO 4. Estoy utilizando el siguiente procedimiento para cargar y visualizar las imagenes:
Código:

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.


La franja horaria es GMT +2. Ahora son las 11:03:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi