2016-03-21 26 views
1

Ich habe mehrere kleine .PNG Bilder, die ich von einer Webadresse laden möchte und in TImage Bilder in meiner Anwendung. Die Bilder sind "dynamisch", also möchte ich sie nicht in meine App unter Verwendung von TImageList usw. "fest codieren".Wie lade ich PNG aus dem Internet in TImage-Steuerelement?

Ich habe mehrere Beispiele gesehen, aber keiner von ihnen kann mir einen direkten Weg dazu bieten.

Ich weiß, ich kann TWebBrowser verwenden, um dies zu lösen, aber es scheint meine Anwendung zu verschleiern und ist nicht auf die Ausrichtung ausgerichtet, ich setze es entweder.

Haben Sie gute Vorschläge?

Meine Plattform ist Android, ich bin mit Embarcadero C++ Builder XE8/Appmethod 1,17

Antwort

2

In Firemonkey, die FMX.Graphics.TBitmap Klasse verarbeitet mehrere Bildformate, einschließlich PNG. Die FMX.Objects.TImage Komponente hat eine Bitmap property. Alles, was Sie tun müssen, ist Indys TIdHTTP-Komponente (oder eine andere HTTP-API/Bibliothek Ihrer Wahl), um die PNG-Bilddaten in eine TMemoryStream zu laden, und dann können Sie die TImage::Bitmap::LoadFromStream()-Methode aufrufen, um beispielsweise die Stream-Daten zur Anzeige zu laden :

TMemoryStream *strm = new TMemoryStream; 
IdHTTP1->Get(L"http://domain/image.png", strm); 
strm->Position = 0; 
Image1->Bitmap->LoadFromStream(strm); 

von einem entfernten Server Zeit in Anspruch nehmen kann, und Sie sollten nie den UI-Thread blockieren, sollten Sie einen worker-Thread benutzen Sie den Download, zum Beispiel zu handhaben, da das herunterladen:

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

Danke für die Antwort Remy !! Ich werde das testen !! Übrigens, ist FMX Gewinde sicher? –

+0

Es ist ungefähr so ​​threadsicher wie RTL/VCL. –

+0

In meinem Versuch, meine eigene Frage zu beantworten, habe ich mich festgenommen ... jedenfalls füge ich sie hier ein: "Es funktioniert! ... wenn ich 'http://www.domain.com/image.png benutze "Aber wenn das Bild ein Bild von zB statischen Karten von Google ist, bekomme ich Probleme. Die Antwort sollte ein PNG sein, aber es scheint, dass ich einen" fatalen Fehler "bekomme. Wenn ich die URL in meinen Webbrowser kopiere, ist es ok dass !! „Keep on & Bleiben Sie auf“ RG“. Habe ich jedenfalls einige Parameter im IdHTTP Client? festlegen müssen, können Sie die Hälfte meiner Probleme gelöst ... ich appriciate –