首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将png从web加载到TImage控件?

如何将png从web加载到TImage控件?
EN

Stack Overflow用户
提问于 2016-03-21 12:42:34
回答 1查看 2.4K关注 0票数 2

在我的应用程序中,我有几张小的.PNG图片,我不想从web地址加载到TImage图像中。这些图片是“动态的”,所以我不想通过使用TImageList等将它们“硬编码”到我的应用程序中。

我见过几个例子,但没有一个能给我一个直截了当的方法。

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

有什么好建议吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 19:19:09

在FireMonkey中,FMX.Graphics.TBitmap类处理多种图像格式,包括PNG。FMX.Objects.TImage组件有一个 property。您只需使用Indy的TIdHTTP组件(或您选择的任何其他HTTP /库)将PNG图像数据下载到TMemoryStream中,然后调用TImage::Bitmap::LoadFromStream()方法加载流数据以供显示,例如:

代码语言:javascript
复制
TMemoryStream *strm = new TMemoryStream;
IdHTTP1->Get(L"http://domain/image.png", strm);
strm->Position = 0;
Image1->Bitmap->LoadFromStream(strm);

由于从远程服务器下载可能需要时间,而且您不应该阻止UI线程,所以应该使用辅助线程来处理下载,例如:

代码语言:javascript
复制
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;
    }
};

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36131348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档