在下面的代码中,我清除了btnSaveClick中的图片,稍后在btnLoadClick中我想将图片分配给图像,但它给出了AV,因为Graphic对象不存在。
我怎样才能完成任务?
procedure TForm1.btnSaveClick(Sender: TObject);
var
fs: TFileStream;
s: TMemoryStream;
buf: TBytes;
z: integer;
begin
fs := TFileStream.Create('c:\temp\a.my', fmCreate);
s := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(s);
z := s.Size;
SetLength(buf, z);
s.Position := 0;
s.ReadBuffer(buf[0], z);
fs.WriteBuffer(z, SizeOf(integer));
fs.WriteBuffer(buf[0], z);
finally
s.Free;
fs.Free;
end;
ShowMessage('ok');
Image1.Picture.Graphic := nil;
end;
procedure TForm1.btnLoadClick(Sender: TObject);
var
fs: TFileStream;
s: TMemoryStream;
buf: TBytes;
z: integer;
gc: TGraphicClass;
begin
fs := TFileStream.Create('c:\temp\a.my', fmOpenRead);
s := TMemoryStream.Create;
try
fs.ReadBuffer(z, SizeOf(integer));
SetLength(buf, z);
fs.ReadBuffer(buf[0], z);
s.WriteBuffer(buf[0], z);
s.Position := 0;
Image1.Picture.RegisterFileFormat('jpg', 'jpeg files', gc);
// Image1.Picture.Graphic.LoadFromStream(s); <-- AV here. Whats the proper way to do it?
finally
s.Free;
fs.Free;
end;
ShowMessage('ok');
end;
如果您从扩展名与注册图像类相对应的文件加载,您可以简单地执行以下操作:
Picture.LoadFromFile(FileName);
否则,您可以创建特定的实例TGraphic
后代(取决于您使用的图形类型)在代码中并将其分配给Graphic
财产,例如对于 JPEG:
var
Graphic: TJpegImage;
begin
Graphic := TJpegImage.Create;
try
Graphic.LoadFromFile(FileName);
Picture.Graphic := Graphic;
finally
Graphic.Free;
end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)