2016-03-21 86 views
1

我有幾個小的.PNG圖片,我不想從網址加載到我的應用程序中的TImage圖像中。這些圖片是「動態」的,所以我不想通過使用TImageList等將它們「硬編碼」到我的應用程序中。如何將網頁中的png加載到TImage控件中?

我看過幾個例子,但沒有一個可以讓我直接做到這一點。

我知道我可以使用TWebBrowser來解決這個問題,但它似乎掩蓋了我的應用程序,並沒有與我將它設置爲的對齊方式對齊。

任何建議嗎?

我的平臺是Android的,我使用英巴卡迪諾C++ Builder的XE8/Appmethod 1.17

回答

2

在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); 
} 
+0

感謝您的回覆雷米!我會測試這個! 順便說一下,FMX線程安全嗎? –

+0

它與RTL/VCL一樣是線程安全的。 –

+0

在我嘗試回覆我自己的問題時,我被困住了......無論如何,我將它粘貼在這裏: 「It works!...當我使用'http://www.domain.com/image.png '但是如果圖片是來自Google靜態地圖的圖片,我會遇到問題,響應應該是png,但似乎我得到了一個「致命錯誤」,如果我將該URL複製到我的瀏覽器中, 。我需要設置一些參數在IdHTTP客戶端? 總之,你解決了我的問題一半......我認爲並欣賞! 「繼續與留在」 RG」 –

相關問題