Reputation: 11
How to get a picture from an URL and put it at TImage using TNetHTTPClient or TNetHTTPRequest? I am beginner and I am using Delphi-10.3-Rio.
I wrote a simple test application, but it does not work as I expect.
I used TNetHTTPClient and 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) ---
1st click on btnGetPict - everything is OK
2nd click on btnGetPict - apear a message: Access violation at address 00407F74 in module 'ProjGetPicture.exe'. Read of address FFFFFFFD.
3rd click on btnGetPict - everything is OK
4th click on btnGetPict - apears a same message again and so on.
I do not know why.
If I delete FreeAndNil(strm);
Everything is OK, but it is a leakage 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.
Upvotes: 1
Views: 1335
Reputation: 643
Insert the following code into the btnGetPict
button's click handler
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.
If you want to load a jpeg file, plug in the JPEG library.
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;
Upvotes: 2