在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」 –