如何从网络加载png到TImage控件?

时间:2016-03-21 12:42:34

标签: url png c++builder timage c++builder-xe8

我有几个小的.PNG图片我不想从网址加载到我的应用程序中的TImage图像。这些图片是“动态的”,因此我不想使用TImageList等将它们“硬编码”到我的应用中。

我见过几个例子,但没有一个可以直接给我这样做。

我知道我可以使用TWebBrowser来解决这个问题,但它似乎模糊了我的应用程序,并且没有与我设置它的对齐方式对齐。

有什么好的建议吗?

我的平台是Android,我使用的是Embarcadero C ++ Builder XE8 / Appmethod 1.17

1 个答案:

答案 0 :(得分: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);
}