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

问题描述

如何使用TNetHTTPClient或TNetHTTPRequest从URL获取图片并将其放在timage中? 我是初学者,正在使用Delphi-10.3-Rio。

我编写了一个简单的测试应用程序,但无法正常运行。

我使用了TNetHTTPClient和TNetHTTPRequest

  object NetHTTPClient: TNetHTTPClient
    Asynchronous = False
    ConnectionTimeout = 60000
    ResponseTimeout = 60000
    HandleRedirects = True
    AllowCookies = False
    UserAgent = 'Embarcadero URI Client/1.0'
    OnAuthEvent = NetHTTPClientAuthEvent
    Left = 7
    Top = 2
  end
  object NetHTTPRqstPicture: TNetHTTPRequest
    Asynchronous = False
    ConnectionTimeout = 60000
    ResponseTimeout = 60000
    MethodString = 'GET'
    Client = NetHTTPClient
    OnRequestCompleted = NetHTTPRqstPictureRequestCompleted
    Left = 103
    Top = 5
  end
implementation
{$R *.dfm}
const
  cUrlPicture = 'http://192.168.1.3/local/fflprapp/tools.cgi?action=getimage&name=56/20200823171910_718702lp_PA088VI_463274.png';


procedure TForm1.btnGetPictClick(Sender: TObject);
begin {0}
  NetHTTPRqstPicture.Get(cUrlPicture);
end;


procedure TForm1.NetHTTPClientAuthEvent(const Sender: TObject; AnAuthTarget: TAuthtargettype;
  const ARealm,AURL: string; var AUserName,APassword: string; var AbortAuth: Boolean;
  var Persistence: TAuthPersistenceType);
begin {0}
  if AnAuthTarget = TAuthtargettype.Server then
     begin
       AUserName := 'root';
       APassword := 'ACCC8ED325EF';
     end;
end;


procedure TForm1.NetHTTPRqstPictureRequestCompleted(const Sender: TObject;
                                                  const AResponse: IHTTPResponse);
var
  strm   : TStream;
  pngImg : TPNGImage;
begin {0}
  strm   := TStream.Create;
  pngImg := TPNGImage.Create;

  strm   := AResponse.ContentStream;
  pngImg.LoadFromStream(strm);
  imgPict.Picture.Graphic := pngImg;

  FreeAndNil(pngImg);   // OK always
  FreeAndNil(strm);     // Here is something strange.
end;

end.

---这是FreeAndNil(strm)的执行方式---

第一次点击btnGetPict-一切正常

第二次单击btnGetPict-出现一条消息: 模块中地址00407F74的访问冲突 'ProjGetPicture.exe'。 读取地址FFFFFFFD。

第三次单击btnGetPict-一切正常

第四次单击btnGetPict-再次发出相同的消息,依此类推。

我不知道为什么。

如果我删除FreeAndNil(strm); 一切都OK,但这是一个泄漏内存。

如果我修改这样的代码

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);

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)