retrieve image saved on database [duplicate]

半世苍凉 提交于 2019-12-28 18:53:21

问题


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


回答1:


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.


来源:https://stackoverflow.com/questions/14726756/retrieve-image-saved-on-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!