retrieve image saved on database [duplicate]
Asked Answered
X

1

2

I'm using this code to load images into my Timage:

begin
if OpenPictureDialog1.Execute(Self.Handle) then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

Then I'm using this code to store into my ms access database:

var
AStream : TMemoryStream;
begin
Adotable1.Append;

AStream := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(AStream);
AStream.Position := 0;
if Adotable1.Active then
begin
  TBlobField(Adotable1.FieldByName('Termograma')).LoadFromStream(AStream);
  end;
finally
AStream.Free;
end;
adotable1.Post;

But now I want to display these saved images on a Timage, can anyone help me? The images are .jpeg format

Xylidine answered 6/2, 2013 at 10:28 Comment(2)
use TBLobStream and TPicture.LoadFromStream /// stackoverflow.com/search?q=%5Bdelphi%5D+blob+pictureSwing
@Arioch'The, could you show me some code?Xylidine
E
4

As far as TPicture is not able to decide which kind of TGraphic it has to create for loading, since a stream does not have an extension like a filename you have to decide it, and assign the Graphic.
In this case a TJPEGImage to the Picture.

var
 JPG:TJPEGImage;
 ms:TMemoryStream;
begin
    JPG:=TJPEGImage.Create;
    ms:=TMemoryStream.Create;
    try
    TBlobField(AdoTable1.FieldByName('Termograma')).SaveToStream(ms);
    ms.Position := 0;
    JPG.LoadFromStream(ms);
    Image2.Picture.Assign(JPG);
    finally
       JPG.Free;
       ms.Free;
    end;
end;

The following unit is able to store diffent graphicformats in blobfields. Storage is not compatible to simple storing of image data because information about then graphicformat is stored too, to give the ability to create the needed class for loading.

unit LoadSaveImageBlobs;

// 20120224 by Thomas Wassermann
// Adapt. RegisterClasses and uses for your requirements
// based on an Idea of  Emiliano Sos

interface
uses Classes,DB,Graphics,Jpeg,PngImage;

Procedure SavePicture2Blob(Blob: TBlobField; Picture: TPicture);
Procedure LoadPictureFromBlob(Picture: TPicture; Blob: TBlobField);
implementation

Procedure SavePicture2Blob(Blob: TBlobField; Picture: TPicture);
var
  ms, ms2: TMemoryStream;
  theClassName: AnsiString;
  len: Byte;
begin
  ms := TMemoryStream.Create;
  try
    Blob.Clear;
    theClassName := Picture.Graphic.ClassName;
    len := Length(theClassName);
    ms.WriteBuffer(len, 1);
    if len > 0 then
      ms.WriteBuffer(theClassName[1], len);
    ms2 := TMemoryStream.Create;
    try
      Picture.Graphic.SaveToStream(ms2);
      ms2.Position := 0;
      if ms2.Size > 0 then
        ms.CopyFrom(ms2, ms2.Size);
    finally
      ms2.Free;
    end;
    Blob.LoadFromStream(ms);
  finally
    ms.Free;
  end;
end;

Procedure LoadPictureFromBlob(Picture: TPicture; Blob: TBlobField);
var
  ms, ms2: TMemoryStream;
  len: Byte;
  theClassName: AnsiString;
  Graphic: TGraphic;
  GraphicClass: TGraphicClass;
begin
  ms := TMemoryStream.Create;
  Blob.SaveToStream(ms);
  ms.Position := 0;
  try
    ms.ReadBuffer(len, 1);
    SetLength(theClassName, len);
    if len > 0 then
      ms.ReadBuffer(theClassName[1], len);
    GraphicClass := TGraphicClass(FindClass(theClassName));
    if (GraphicClass <> nil) and (len > 0) then
    begin
      Graphic := GraphicClass.Create;
      ms2 := TMemoryStream.Create;
      try
        ms2.CopyFrom(ms, ms.Size - len - 1);
        ms2.Position := 0;
        Graphic.LoadFromStream(ms2);
      finally
        ms2.Free;
      end;
      Picture.Assign(Graphic);
    end;
  finally
    ms.Free;
  end;
end;


initialization
// you might register others if wished
RegisterClasses([TIcon, TMetafile, TBitmap, TJPEGImage,TPngImage]);

end.
Expositor answered 6/2, 2013 at 10:37 Comment(1)
TPicture is not able to decide which kind of TGraphic ... since a stream does not have an extension - at very least in Delphi XE2 (and it was out in 2013) you can look into VCL's TPicture.ReadData and TPicture.WriteData - you would see that the actual picture data is prefixed with UTF-8 ShortString of the implementation class name, so as long as it is one and the same application this is even better than filename extension. Granted, it would take extra boilerplate to actually utilize it (ComponentToStream DFM loading/storing sequence)Swing

© 2022 - 2024 — McMap. All rights reserved.