从网络加载 png 图像 (delphi fmx)

Ger*_*ard 4 delphi firemonkey

我想从网络加载 png 图像,但使用下面的代码,并非所有图像都能正确进入流中(在网络浏览器中发布 url 时,例如边缘,确实会正确给出图像)。例如,代码中的第一个url给出了加载位图失败的错误(流中的FSize只有14?),而第二个url则没有给出问题。有谁知道如何正确下载第一个网址?

为了使这段代码正常工作,将一个 TButton 和一个 TImage 放在窗体上。
在uses中添加了System.Net.HttpClientComponent。我使用的是德尔福10.3.3。调频。

谢谢,杰拉德

    procedure TForm1.Button1Click(Sender: TObject);
    var ms: TmemoryStream;
        httpCli: TNetHTTPClient;
        url: string;
    begin
      httpCli := TNetHTTPClient.Create(nil);
      ms := TMemoryStream.Create();
    
      url := 'https://a.tile.openstreetmap.org/11/1050/674.png';
  //  url := 'https://upload.wikimedia.org/wikipedia/commons/d/d5/Japan_small_icon.png';
    
      httpCli.Get(url,ms);
      ms.Position := 0;
      Image1.Bitmap.LoadFromStream(ms);
    
      ms.free;
      httpCli.free;
    end;
Run Code Online (Sandbox Code Playgroud)

fpi*_*tte 7

OpenStreetMap 图块服务器的问题在于 UserAgent。您必须将默认值更改为服务器可接受的值。我检查了多种可能性,看起来除了默认值之外几乎什么都没有TNetHTTPClient。有关详细信息,请参阅这篇维基百科文章

为此,您需要添加行

httpCli.UserAgent := 'Delphi/4.0 (compatible; Delphi; HttpClient)';
Run Code Online (Sandbox Code Playgroud)

我的代码版本(包括 HTTP 状态代码检查)如下:

procedure TForm1.Button1Click(Sender: TObject);
var
    ms       : TMemoryStream;
    httpCli  : TNetHTTPClient;
    resp     : IHTTPResponse;
    url      : String;
begin
    httpCli := TNetHTTPClient.Create(nil);
    try
        httpCli.UserAgent := 'Delphi/4.0 (compatible; Delphi; HttpClient)';
        ms := TMemoryStream.Create();
        try
            url  := 'https://a.tile.openstreetmap.org/11/1050/674.png';
            resp := httpCli.Get(url, ms);
            if resp.StatusCode <> 200 then
                Memo1.Lines.Add(Format('HTTP Error=%d %s',
                                       [resp.StatusCode, resp.StatusText]))
            else begin
                ms.Position := 0;
                Image1.Bitmap.LoadFromStream(ms);
            end;
        finally
            ms.Free;
        end;
    finally
        httpCli.Free;
    end;
end;
Run Code Online (Sandbox Code Playgroud)