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

标签 delphi firemonkey

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

为了让这段代码工作,一个 TButton 和一个 TImage 被放在一个表单上。
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;

最佳答案

OpenStreetMap 瓦片服务器的问题在于 UserAgent。您必须将默认值更改为服务器可接受的值。我检查了许多可能性,除了 TNetHTTPClient 的默认值之外,它看起来几乎没有任何效果。看到这个Wikipedia article了解详情。

为此,您需要添加该行

httpCli.UserAgent := 'Delphi/4.0 (compatible; Delphi; HttpClient)';

我的代码版本包括 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;

关于delphi - 从网络加载 png 图像 (delphi fmx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67755513/

相关文章:

delphi - 如何在 C++ DLL 中使用 Delphi 中的 Unicode

delphi - 寻找方法/组件来读取/编辑真正的 MS Excel 2007 文件

delphi - 为什么我仅在 HTTPS (SSL) 网站上使用 Indy 时才收到 "Connection reset by peer"?

multithreading - 如何在多线程时安全地访问和修改数组?

IOS + 德尔福 : low memory warnings - possible memory leak with TTexture?

delphi - 与单元文件中的单元文件路径一起使用

delphi - 在 FastReport 中创建数据集的分布图(钟形曲线)的最佳方法是什么?

delphi - 访问 protected 属性(property)

macos - 使用 Firemonkey 2 (FMX2) 以跨平台方式设置鼠标位置

delphi - 无法在 Delphi 11 中注册任何组件