andriana
andriana

Reputation: 11

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? 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

Answers (1)

Softacom
Softacom

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

Related Questions