2016-03-21 45 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” –

相关问题