在FireMonkey,该FMX.Graphics.TBitmap
类处理多种图像格式,包括PNG。 FMX.Objects.TImage
组件有一个Bitmap
property。您所要做的就是使用Indy的TIdHTTP
组件(或您选择的任何其他HTTP API /库)将PNG图像数据下载到TMemoryStream
,然后您可以调用TImage::Bitmap::LoadFromStream()
方法加载流数据以供显示,例如:
TMemoryStream *strm = new TMemoryStream;
IdHTTP1->Get(L"http://domain/image.png", strm);
strm->Position = 0;
Image1->Bitmap->LoadFromStream(strm);
由于从远程服务器下载需要时间,你应该永远不会阻塞UI线程,你应该使用一个工作线程来处理下载,例如:
class TDownloadThread : public TThread
{
protected:
virtual void __fastcall Execute()
{
TIdHTTP *Http = new TIdHTTP(NULL);
Http->Get(L"http://domain/image.png", Strm);
Strm->Position = 0;
}
public:
TMemoryStream *Strm;
__fastcall TDownloadThread()
: TThread(true)
{
FreeOnTerminate = true;
Strm = new TMemoryStream;
}
};
void __fastcall TMyForm::DownloadImage()
{
TDownloadThread *Thread = new TDownloadThread();
Thread->OnTerminate = &DownloadThreadFinished;
Thread->Start();
}
void __fastcall TMyForm::DownloadThreadFinished(TObject *Sender)
{
TDownloadThread *Thread = static_cast<TDownloadThread*>(Sender);
if (!Thread->FatalException)
Image1->Bitmap->LoadFromStream(Thread->Strm);
}
感谢您的回复雷米!我会测试这个! 顺便说一下,FMX线程安全吗? –
它与RTL/VCL一样是线程安全的。 –
在我尝试回复我自己的问题时,我被困住了......无论如何,我将它粘贴在这里: “It works!...当我使用'http://www.domain.com/image.png '但是如果图片是来自Google静态地图的图片,我会遇到问题,响应应该是png,但似乎我得到了一个“致命错误”,如果我将该URL复制到我的浏览器中, 。我需要设置一些参数在IdHTTP客户端? 总之,你解决了我的问题一半......我认为并欣赏! “继续与留在” RG” –