You must tell TPicture which TGraphic class to use before you can load data into it. If you use only one graphic type, you can hardcode it, for example:
procedure TForm1.btnSaveClick(Sender: TObject); var fs: TFileStream; s: TMemoryStream; z: integer; begin s := TMemoryStream.Create; try Image1.Picture.Graphic.SaveToStream(s); fs := TFileStream.Create('c:\temp\a.my', fmCreate); try z := s.Size; fs.WriteBuffer(z, SizeOf(integer)); s.Position := 0; fs.CopyFrom(s, z); finally fs.Free; end; finally s.Free; end; ShowMessage('ok'); Image1.Picture.Graphic := nil; end; procedure TForm1.btnLoadClick(Sender: TObject); var fs: TFileStream; s: TMemoryStream; z: integer; jpg: TJPEGImage; begin s := TMemoryStream.Create; try fs := TFileStream.Create('c:\temp\a.my', fmOpenRead); try fs.ReadBuffer(z, SizeOf(integer)); s.CopyFrom(fs, z); finally fs.Free; end; jpg := TJPEGImage.Create; try s.Position := 0; jpg.LoadFromStream(s); Image1.Picture.Graphic := jpg; finally jpg.Free; end; finally s.Free; end; ShowMessage('ok'); end;
However, if you use several graphic types, you need to save the image type in a file and read it back to create the correct class object, for example:
procedure TForm1.btnSaveClick(Sender: TObject); var fs: TFileStream; s: TMemoryStream; z: integer; str: AnsiString; begin str := Image1.Picture.Graphic.ClassName; s := TMemoryStream.Create; try Image1.Picture.Graphic.SaveToStream(s); fs := TFileStream.Create('c:\temp\a.my', fmCreate); try z := Length(str); fs.WriteBuffer(z, SizeOf(integer)); fs.WriteBuffer(Str[1], z); z := s.Size; fs.WriteBuffer(z, SizeOf(integer)); s.Position := 0; fs.CopyFrom(s, z); finally fs.Free; end; finally s.Free; end; ShowMessage('ok'); Image1.Picture.Graphic := nil; end; procedure TForm1.btnLoadClick(Sender: TObject); var fs: TFileStream; s: TMemoryStream; z: integer; str: AnsiString; g: TGraphic; begin s := TMemoryStream.Create; try fs := TFileStream.Create('c:\temp\a.my', fmOpenRead); try fs.ReadBuffer(z, SizeOf(integer)); SetLength(str, z); fs.ReadBuffer(str[1], z); fs.ReadBuffer(z, SizeOf(integer)); s.CopyFrom(fs, z); finally fs.Free; end; g := TGraphicClass(FindClass(str)).Create; try s.Position := 0; g.LoadFromStream(s); Image1.Picture.Graphic := g; finally g.Free; end; finally s.Free; end; ShowMessage('ok'); end;
source share