Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение Alex2013 » 28.08.2017 13:44:05

Народ как помощью например synapse получить картинку из интернета и по прямой ссылке и загрузить ее в TImage ?
Для дефльфи рецепт нашел ...

Код: Выделить всё
Str:=TMemoryStream.create;
Http.Get('http://*.*, str);
Str.Seek(0,soFromBeginning);
Image1.Picture.LoadFromStream(str);
Str.free;

А в лазарусе что-то не то ... не грузит !
Код: Выделить всё
HTTP := THTTPSend.Create;
   Result :=  HTTP.HTTPMethod('GET', 'http://...');
if Result then
    Image1.Picture.LoadFromStream(HTTP.Document);
HTTP.free;

Где я напортачил ?
Последний раз редактировалось Alex2013 28.08.2017 17:04:12, всего редактировалось 2 раз(а).
Alex2013
энтузиаст
 
Сообщения: 698
Зарегистрирован: 03.04.2013 11:59:44

Re: Картинка из интернета прямая загрузка в TImage

Сообщение pupsik » 28.08.2017 16:25:32

HTTP.Document ....Seek(0,soFromBeginning)
pupsik
энтузиаст
 
Сообщения: 1011
Зарегистрирован: 20.08.2014 16:20:13

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение Alex2013 » 28.08.2017 16:48:47

pupsik писал(а):HTTP.Document ....Seek(0,soFromBeginning)

Спасибо за отзыв но это HTTP.HTTPMethod('GET', 'http://...'); сам делает ...
(И я тоже пробовал делать HTTP.Document.Seek не помогло ... там что-то с форматом данных нездоровое делается )

Но пока ждал ответа самостоятельно нарыл другое решение ....


Код: Выделить всё
var s:TMemoryStream;
begin
s:=TMemoryStream.Create;
HttpGetBinary('http://127.0.0.1/ban0.jpg', s); // Хорошо  иметь свой сервер в столице ...  :)
s.Seek(0, soFromBeginning);
  Image1.Picture.LoadFromStream(S);
  Image1.Refresh;
s.Free;
end;

Так что всем спасибо "все решено могучи ураганом !" :D :idea:
Alex2013
энтузиаст
 
Сообщения: 698
Зарегистрирован: 03.04.2013 11:59:44

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение pupsik » 28.08.2017 17:33:44

Alex2013 вот кто его знает....
но всё работает
Код: Выделить всё
const
  im_url = 'http://freepascal.ru/images/logo.png';
var
  im_get : THTTPSend;
begin
  im_get := THTTPSend.Create;
  im_get.HTTPMethod('GET', im_url);
  if im_get.ResultCode = 200 then
    Image1.Picture.LoadFromStream(im_get.Document)
  else
    ShowMessage(inttostr(im_get.ResultCode));
  FreeAndNil(im_get);

Т.е. картинка грузится и т.д... Вместо ResultCode можно "повесить" ответ сервера.

То что поток в начало переводится - моя привычка. Не всегда он там где хочется (т.е. не во всём).

Result := HTTP.HTTPMethod('GET', 'http://...'); .... Ну вернёт он вам True. И что это даст?
pupsik
энтузиаст
 
Сообщения: 1011
Зарегистрирован: 20.08.2014 16:20:13

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение Alex2013 » 30.08.2017 01:36:19

Ну у меня мой код уже работает в реальных условиях ... ( то есть с возможностью ошибок в адресе )
Изображение
Текущая версия загрузчика :
Код: Выделить всё
//Загрузка изображений из сети
procedure NetLoadImg(Url:String;var BMP:Tbitmap );
var
Image1:TImage;
s:TMemoryStream;
begin
if bmp<>Nil then bmp.Free;
s:=TMemoryStream.Create;
If HttpGetBinary(URL, s) then begin
BMP:=Tbitmap.Create;
s.Seek(0, soFromBeginning);
  Image1:=TImage.Create(nil);
  Image1.Picture.LoadFromStream(S);
  bmp.Assign(Image1.Picture.Bitmap);
  Image1.Free;
end ;
s.Free;
end;


Правда при ошибочном адресе действительно подтормаживает ...
Но для конкретной задачи это пока несущественно ..
Ваш вариант явно будет тормозить точно также .
Вот если бы сделать более быструю проверку валидности адреса ДО вызова загрузки .
вот это было бы реально полезно ! :idea:
Alex2013
энтузиаст
 
Сообщения: 698
Зарегистрирован: 03.04.2013 11:59:44

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение pupsik » 30.08.2017 09:43:02

Правда при ошибочном адресе действительно подтормаживает
не совсем понятно. Т.е. обычно задействуется поток. Как у вас... к.з..

HttpGetBinary - та же шапка.... что и:
Ваш вариант явно будет тормозить точно также .
это не мой вариант, а стандарт для синапсе...

Вот если бы сделать более быструю проверку валидности адреса ДО вызова загрузки .
не понимаю что вы имеете ввиду но:
1. ResultCode
2. Ответ сервера
3. Валидность юрл (проверка строки адреса на соответствие) - есть функции в инете (вроде и в лазаре да и в синапсе)
pupsik
энтузиаст
 
Сообщения: 1011
Зарегистрирован: 20.08.2014 16:20:13

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение Alex2013 » 31.08.2017 11:46:19

pupsik писал(а):не понимаю что вы имеете ввиду но:
1. ResultCode
2. Ответ сервера
3. Валидность юрл (проверка строки адреса на соответствие) - есть функции в инете (вроде и в лазаре да и в синапсе)

Я имею ввиду просто возможность быстро "пропинговать" адрес не пытаясь загрузить + после считать заголовок и только потом в случае "полного успеха" читать данные ну и проверка конкретности URL адреса вообще (с этим все понятно ). Хотя проблема чуть надуманная просто у меня ввод строки сопровождается ее использованием качестве URL что разумеется не совсем правильно Нужно сделать текущий адрес + возможность его изменить по кнопке.
(Хотя "живой поиск" в браузерах ведь как-то работает и не тормозит... Верно ? Значит можно сделать подобный "финт ушами" и в своих программах )

Зы
:!: :idea: Тут новая проблема образовалась "на ровном месте" если урл содержит порт загрузка начинает страшно и непонятно ругаться (что-то про потоки) и не работает ... Вопрос есть ли в синапсе возможность сменить http порт с 80-го на произвольный :?: (Для прокси ведь ввод порта есть )
Alex2013
энтузиаст
 
Сообщения: 698
Зарегистрирован: 03.04.2013 11:59:44

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение Лекс Айрин » 31.08.2017 12:33:00

Alex2013 писал(а):Хотя "живой поиск" в браузерах ведь как-то работает и не тормозит... Верно ? Значит можно сделать подобный "финт ушами" и в своих программах


Твой "живой" поиск это постоянно отправляемый на сервер запрос со всеми вытекающими.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4097
Зарегистрирован: 19.02.2013 16:54:51

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение pupsik » 01.09.2017 20:52:11

Я имею ввиду просто возможность быстро "пропинговать" адрес не пытаясь загрузить...
дык синапс, вроде как, пингует... Или вам необходим бубен который по какой то строке сможет узнать: есть адресс или нет :lol:
pupsik
энтузиаст
 
Сообщения: 1011
Зарегистрирован: 20.08.2014 16:20:13

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение Alex2013 » 03.09.2017 22:10:15

Опять что-то не так! Я тут вроде добавил возможность использовать нестандартный порт ...
(Просто в место не типизированной константы сделал типизированную
Код: Выделить всё
unit httpsend;
interface
uses
  SysUtils, Classes,
  blcksock, synautil, synaip, synacode, synsock;
const
  cHttpProtocol:String = '80';
...

)
С моим сервером все работает на ура ...
А тем что в IP WebCam на смартфоне работать не хочет.
( Локальный адрес http://192.168.0.101:1024/shot.jpg Браузере видит а в программе нет ...
Хотя вот эту камеру с 81 порта видит http://mozart.amadeus-hotel.com:81/view ... /image.jpg )
Я в догадках теряюсь ... :roll: может там JPG какой-то кривой ?
Alex2013
энтузиаст
 
Сообщения: 698
Зарегистрирован: 03.04.2013 11:59:44

Re: Картинка из интернета прямая загрузка в TImage [РЕШЕНО]

Сообщение pupsik » 03.09.2017 22:20:01

может там JPG какой-то кривой ?

1. Что в шапке ответа сервера?
2. Что в теле потока?
Сохраните полученный файл на диск и просмотрите что сохранилось. И т.д., и т.п...

п.с.
Опять что-то не так!
первый раз что ли? :lol:
pupsik
энтузиаст
 
Сообщения: 1011
Зарегистрирован: 20.08.2014 16:20:13


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru