如何将 png 从 web 加载到 TImage 控件中?
How do I load png from web into TImage control?
我有几张 .PNG 小图片,我不想从网址加载到我的应用程序中的 TImage
图片中。图片是 "dynamic",所以我不想 "hardcode" 使用 TImageList
等
将它们添加到我的应用程序中
我看过几个例子,但是其中 none 个可以给我一个直接的方法来做到这一点。
我知道我可以使用 TWebBrowser
来解决这个问题,但它似乎模糊了我的应用程序并且与我设置的对齐方式不一致。
有什么好的建议吗?
我的平台是 Android,我使用的是 Embarcadero C++Builder XE8 / Appmethod 1.17
在 FireMonkey 中,FMX.Graphics.TBitmap
class handles multiple image formats, including PNG. The FMX.Objects.TImage
component has a Bitmap
property。您所要做的就是使用 Indy 的 TIdHTTP
组件(或您选择的任何其他 HTTP API/library)将 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);
}
我有几张 .PNG 小图片,我不想从网址加载到我的应用程序中的 TImage
图片中。图片是 "dynamic",所以我不想 "hardcode" 使用 TImageList
等
我看过几个例子,但是其中 none 个可以给我一个直接的方法来做到这一点。
我知道我可以使用 TWebBrowser
来解决这个问题,但它似乎模糊了我的应用程序并且与我设置的对齐方式不一致。
有什么好的建议吗?
我的平台是 Android,我使用的是 Embarcadero C++Builder XE8 / Appmethod 1.17
在 FireMonkey 中,FMX.Graphics.TBitmap
class handles multiple image formats, including PNG. The FMX.Objects.TImage
component has a Bitmap
property。您所要做的就是使用 Indy 的 TIdHTTP
组件(或您选择的任何其他 HTTP API/library)将 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);
}