简体   繁体   English

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

[英]How to get a picture from an URL and put it at TImage using TNetHTTPClient or TNetHTTPRequest?

How to get a picture from an URL and put it at TImage using TNetHTTPClient or TNetHTTPRequest?如何使用 TNetHTTPClient 或 TNetHTTPRequest 从 URL 获取图片并将其放在 TImage 中? I am beginner and I am using Delphi-10.3-Rio.我是初学者,我正在使用 Delphi-10.3-Rio。

I wrote a simple test application, but it does not work as I expect.我写了一个简单的测试应用程序,但它并没有像我预期的那样工作。

I used TNetHTTPClient and TNetHTTPRequest我使用了 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.

--- here is how executes FreeAndNil(strm) --- --- 这里是如何执行 FreeAndNil(strm) ---

1st click on btnGetPict - everything is OK第一次单击 btnGetPict - 一切正常

2nd click on btnGetPict - apear a message: Access violation at address 00407F74 in module 'ProjGetPicture.exe'.第二次单击 btnGetPict - 出现一条消息:模块“ProjGetPicture.exe”中地址 00407F74 的访问冲突。 Read of address FFFFFFFD.读取地址 FFFFFFFD。

3rd click on btnGetPict - everything is OK第三次单击 btnGetPict - 一切正常

4th click on btnGetPict - apears a same message again and so on.第 4 次单击 btnGetPict - 再次显示相同的消息,依此类推。

I do not know why.我不知道为什么。

If I delete FreeAndNil(strm);如果我删除FreeAndNil(strm); Everything is OK, but it is a leakage memory.一切正常,但它是泄漏 memory。

If I modify a code like this如果我修改这样的代码

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

Everything is run.... until the program closes, when apear same message.一切都在运行......直到程序关闭,当出现相同的消息时。

Insert the following code into the btnGetPict button's click handler将以下代码插入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;

Also, don't forget to add the name of the PNGImage library to the uses line.另外,不要忘记将 PNGImage 库的名称添加到uses行。 If you want to load a jpeg file, plug in the JPEG library.如果要加载 jpeg 文件,请插入 JPEG 库。 Insert the code below.插入下面的代码。

 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM