delphi 如何使用TNetHTTPClient或TNetHTTPRequest从URL获取图片并将其放到TImage?

kb5ga3dv  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(418)

如何使用TNetHTTPClient或TNetHTTPRequest从URL获取图片并将其放在TImage?我是初学者,我正在使用 Delphi -10. 3-Rio。
我编写了一个简单的测试应用程序,但它并没有像我预期的那样工作。
我使用了TNetHTTPClient和TNetHTTPRequest
第一个
---下面是如何执行FreeAndNil(strm)---
第一次点击btnGetPict -一切正常
第二次单击btnGetPict-a-显示一条消息:模块'ProjGetPicture.exe'中的地址00407 F74发生访问冲突。读取地址FFFFFFFD。
第三次点击btnGetPict -一切正常
第四次单击btnGetPict -再次显示相同的信息,依此类推。
我也不知道为什么。
如果我删除FreeAndNil(strm);一切正常,但它是一个泄漏内存.
如果我像这样修改代码

var 
  strmG : TStream;

procedure TForm1.FormCreate(Sender: TObject);
begin
  strmG := TStream.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(strmG);
end;

// and use strmG instead strm in:
//  strmG := AResponse.ContentStream;
//  pngImg.LoadFromStream(strmG);

一切都在运行....直到程序关闭,出现相同的消息。

yfjy0ee7

yfjy0ee71#

将以下代码插入btnGetPict按钮的单击处理程序

procedure TForm1.btnGetPictClick(Sender: TObject);
var
  Memo : TMemoryStream;
  png : TPngImage;
begin
  Memo := TMemoryStream.Create;
  try
    NetHTTPClient1.Get(cUrlPicture, Memo); // cUrlPicture - this you constant with url from an picture
    Memo.Position := 0;
    png := TPngImage.Create;
    try
      png.LoadFromStream(Memo);
      Image1.Picture.Assign(png);
    finally
      png.Free;
    end;
  finally
    Memo.free;
  end;
end;

另外,不要忘记将PNGImage库的名称添加到uses行。如果要加载jpeg文件,请插入JPEG库。插入下面的代码。

procedure TForm1.Button9Click(Sender: TObject);
var
   Memo : TMemoryStream;
   jpg:TJPEGImage;
begin
  Memo := TMemoryStream.Create;
  try
    NetHTTPClient1.Get(cUrlPicture, Memo);
    Memo.Position := 0;
    jpg := TJPEGImage.Create;
    try
      jpg.LoadFromStream(Memo);
      Image1.Picture.Assign(jpg);
    finally .
      jpg.Free;
    end;
  finally .
    Memo.free;
  end;
end;

相关问题