В статье будет рассмотрен вопрос загрузки PNG-изображений из интернета в элемент TImage в приложениях на Delphi, использующих FireMonkey. Мы рассмотрим типичную проблему, с которой сталкиваются разработчики при работе с удаленными PNG-изображениями, и предложим решение, основанное на примере кода на Object Pascal.
При разработке приложений с использованием Delphi и FireMonkey для платформы Android может возникнуть необходимость загрузки изображений из интернета. Например, при генерации QR-кодов. Вопрос, который часто задают разработчики, заключается в том, как правильно загрузить удаленное PNG-изображение в элемент TImage.
Пример некорректного использования
Рассмотрим код, который пытается загрузить PNG-изображение, но сталкивается с ошибкой "Invalid stream format":
procedure TfrmMain.Button1Click(Sender: TObject);
var
MS: TMemoryStream;
Png: TImageMultiResBitmap;
begin
MS := TMemoryStream.Create;
Png := TImageMultiResBitmap.Create(nil); // Исправление: использование nil
try
IdHTTP1.Get('https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=chujisko', MS);
MS.Seek(0, soFromBeginning);
Png.LoadFromStream(MS);
img1.MultiResBitmap.Assign(Png); // Исправление: использование img1.Bitmap
finally
FreeAndNil(Png);
FreeAndNil(MS);
end;
end;
Ошибка в данном примере заключается в том, что используется класс TImageMultiResBitmap, который не подходит для однократной загрузки PNG, так как он предназначен для работы с многорезультационными изображениями. Кроме того, при создании TImageMultiResBitmap был использован некорректный параметр владельца (owner), что привело к ошибке.
Корректное решение
Используя советы из сообщества, разработчик перешел к использованию TBitmap вместо TImageMultiResBitmap, что позволило успешно загрузить изображение в элемент TImage. Вот исправленный код:
procedure TfrmMain.Button1Click(Sender: TObject);
var
qrDims: Integer;
MS: TMemoryStream;
begin
if Edit1.Text <> '' then
begin
qrDims := Screen.Width - 100;
IdHTTP1.Get('http://chart.googleapis.com/chart?chs=' + IntToStr(qrDims) + 'x' + IntToStr(qrDims) + '&cht=qr&chl=' + Edit1.Text, MS);
MS.Seek(0, soFromBeginning);
img1.Bitmap.LoadFromStream(MS);
end
else
ShowMessage('Пожалуйста, введите текст.');
end;
После загрузки изображения в Bitmap элемента TImage, строка Png := TImageMultiResBitmap.Create(nil); и соответствующая строка, которая пыталась присвоить MultiResBitmap, были удалены из кода, так как они больше не были нужны.
Заключение
При работе с загрузкой изображений в приложениях FireMonkey важно правильно выбирать компоненты и корректно обращаться с потоками данных. В данном случае, замена TImageMultiResBitmap на TBitmap и корректное использование потока TMemoryStream позволили успешно решить проблему. Следуя этим рекомендациям, разработчики смогут избежать распространенных ошибок при работе с удаленными PNG-изображениями.
В статье рассматривается проблема и решение для загрузки PNG-изображений из интернета в элемент TImage в приложениях на Delphi с использованием FireMonkey, с акцентом на типичные ошибки и корректный подход к использованию потоков данных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS