微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 将nil分配给TImage.Picture.Graphic以清除图片后,我该如何再次使用它?

在下面的代码中,我清除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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐