を使用しています。 FMX.Objects.TImage
コンポーネントはBitmap
propertyです。 PNG画像データをTMemoryStream
にダウンロードするには、IndyのTIdHTTP
コンポーネント(またはその他の任意のHTTP API /選択したライブラリ)を使用して、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);
}
返信いただきありがとうございます。私はこれをテストします!! ところで、FMXスレッドは安全ですか? –
RTL/VCLほどスレッドセーフです。 –
私自身の質問に返答しようとしたところで、私は固定されていました...とにかく私はここにそれを貼り付けます: "これは動作します...私が使用すると、" http://www.domain.com/image.pngしかし、画像がGoogleの静的マップからの画像であれば、問題は発生します。応答はPNGでなければなりませんが、 "致命的なエラー"が表示されているようです。 。私はIdHTTPクライアントにいくつかのパラメータを設定する必要がありますか? とにかく、あなたは私の問題の半分を解決し...私は は「上のキープ&上の滞在」 RG」 –