gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:25:54 25 4
gpt4 key购买 nike

我想从网络加载 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com