url - 如何将 png 从 Web 加载到 TImage 控件中?

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

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

我看过几个例子,但没有一个能给我直接的方法来做到这一点。

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

有什么好的建议吗?

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

最佳答案

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

关于url - 如何将 png 从 Web 加载到 TImage 控件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36131348/

相关文章:

Javascript、URL 解析、条件 CSS 样式。在导航菜单上显示

javascript - javascript中存在匹配子字符串的正则表达式

c++ - VirtualTreeView 在 C++ Builder 中完成 UnicodeString

delphi - KaZip for C++Builder2009/Delphi

python - 如何使用 BeautifulSoup 提取网站中的所有 URL

javascript - Chrome.webrequest.onBeforeRequest 多次调用自身

image - OpenCV : Transparent area of imported . png 文件现在是白色的

windows - 从一组 png 图像创建动画 gif

haskell - 在 Haskell 中使用 OpenGL 渲染 PNG 图像

c++ - 没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小