Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > XE7 и загрузка картинки в потоке


Автор: Adm123 27.2.2015, 15:50
Доброго всем дня!
Помогите решить проблему..!

Есть файл картинки в и-нете (jpg). Есть TImage. Как отобразить картинку в TImage-е в потоке? Ни в какую чего-то не выходит...

Код

type TLoadImg=class(TThread)
  protected
  procedure Execute: override;
end;

procedure TLoadImg.Execute;
var
idhttp: TIdHTTP;
ms: TMemoryStream;
timg: TBitmap;
begin
  idhttp:= TIdHttp.Create(nil);
  ms:= TMemoryStream.Create;
  idhttp.Get('http://domain.com/image.jpg', ms);
  ms.Position:= 0;
  timg:= TBitmap.CreateFromStream(ms);
  Image1.Bitmap.Assign(timg);
  idhttp.free;
  ms.free;
  timg.free;
end;

procedure Btn1.Click(sender: TObject);
begin
  LoadImg:= TLoadImg.Create(true);
  LoadImg.FreeOnTerminate:= true;
  LoadImg.Start;
end;


Не работает сия конструкция... Если в БаттонКлик написать код потока - работает. А так - не хочет. Подскажите, как быть..?

Заранее извиняюсь за возможные опечатки - код писал, а не копировал. В программе синтаксических ошибок нет.

Автор: Illusion Dolphin 27.2.2015, 16:06
Цитата

image.jpg

Цитата

TBitmap.CreateFromStream

Битмап и jpep это разные форматы. Надо сделать TJpegImage считать его из потока и потом его преобразовывать в TBitmap. 

P.S. Image1.Bitmap.Assign(timg); - Что-то мне подсказывает, что это потоко-небезопасно. 

Автор: Adm123 27.2.2015, 16:15
Насчет потокобезопасности буду разбираться, я пока не силен в этом...
А вот 

timg: TGpegImage

никак написать не получается.  Не хочет он в uses воспринимать vcl.imaging.jpeg почему-то...

да и в основном-то потоке работает, проверено...

Автор: Illusion Dolphin 27.2.2015, 17:14
Цитата

timg: TGpegImage

Может буква не та?

Автор: Alexeis 28.2.2015, 15:11
Создать TJpegImage в потоке и загрузить в него картинку вполне возможно. Вопрос потокобезопасности возникает при одновременном доступе из 2х потоков. А вот назначать загруженную картинку объекту TImage лучше в главном потоке, поскольку TImage связан с окном на котором он лежит, а окно создано в главном потоке. Но назначение картинки операция быстрая. Обычно в этом случае присваивается внутренний контент с увеличением счетчика ссылок. После этого можно уничтожить TJpegImage. Эта операция не уничтожить изображение в TImage, просто уменьшится внутренний счетчик ссылок. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)