как получить изображение из TWebBrowser в TImage

У меня есть панель в верхней части формы с небольшим TMemo, настроенным как цель перетаскивания для URL-адресов. Ниже у меня есть элемент управления страницей с 2 ​​вкладками. Я установил TWebBrowser на одной вкладке и еще кое-что на второй вкладке. В TWebBrowser мне нужно войти на имеющийся у нас сайт по продаже билетов об ошибках, а затем просмотреть билеты. В некоторых билетах есть ссылки на небольшие изображения, которые клиенты хотят, чтобы мы использовали (подумайте что-то вроде логотипов). Я могу щелкнуть по ним левой кнопкой мыши, а затем перетащить ссылку из TWebBrowser в TMemo вверху формы. Это подбирает URL-адрес и заголовок изображения, как и ожидалось.

Связанное событие OnDrop также переключается на вторую вкладку, где я нажимаю кнопку «Обработка». Это заставляет браузер переходить к изображению (через Navigate2), которое он загружает в окно браузера. Это изображение - все, что находится в окне браузера на данный момент.

Итак, теперь мне нужен код, чтобы захватить изображение и загрузить его в TImage на второй вкладке. FWIW, исходное изображение - PNG.

Я могу получить высоту и ширину изображения из целевого изображения, но большую часть времени я не получаю само изображение, чтобы оно отображалось в TImage. Иногда, но в основном нет. Я могу без проблем загружать PNG в эти объекты изображения, поэтому я знаю, что PNG правильно отображает.

(Возможно, есть способ загрузить изображение напрямую, но мне не удалось заставить его работать. TWebBrowser используется для входа во внутреннюю систему сообщений об ошибках, где предоставляются изображения, и я могу получить доступ к этому сайту только если он находится в той же форме, и я вошел в систему. В противном случае DL загружает страницу входа в HTML вместо изображения. Если есть способ сделать это в текущей структуре, я открыт для предложений.)

Я нахожу файл изображения на веб-странице с помощью IHTMLElement2.getelementsByTagName ('img') и беру первый (поскольку я знаю, что это все, что есть на веб-странице).

  img := getFirstImage;
  Image1_frame.Height := img.height+2;
  Image1_frame.Width := img.width+2;
  rnd := img as IHTMLElementRender ;
  rnd.DrawToDC(Image1.Canvas.Handle);

Изображение1 выровнено с клиентом на панели с именем Image1_frame. Итак, я установил H & W рамы - они настроены нормально.

Но изображения обычно не видно. Он просто белый.

Я вижу, что DrawToDC устарел, но я не нашел, чем его заменить.


person David    schedule 22.06.2020    source источник
comment
Я вижу, что DrawToDC устарел, но я не нашел, чем его заменить - см. Как отображать WebBrowser к контексту устройства?   -  person Remy Lebeau    schedule 23.06.2020
comment
Возможно, есть способ загрузить изображение напрямую, но мне не удалось заставить его работать ... да, вы можете использовать клиентский компонент http для загрузки любого файла, если у вас есть URL-адрес. Вы можете использовать ICS (wiki.overbyte.be или использовать собственный GetIT Delphi для его получения) или Indy. Некоторые URL-адреса являются частью защищенной веб-области, поэтому вы также должны выполнить аутентификацию с помощью компонента HTTP и / или пройти через какую-либо страницу, чтобы захватить cookie, прежде чем документ будет доставлен.   -  person fpiette    schedule 23.06.2020
comment
Я пробовал подход DL с Indy, но все время получал большой текстовый блок, представляющий собой html, который составлял страницу входа. Я не знаю, какой cookie нужен. Как я уже сказал, именно поэтому я помещаю браузер на первую вкладку, чтобы другая логика работала в том же сеансе, что и первоначальный вход в систему. Как я могу сделать запрос DL после того, как пользователь вошел в систему на первой вкладке? Вот что мне непонятно. Меня не волнует, Indy это или ICS, я просто не понимаю, как это сделать, учитывая то, что я нашел об этом.   -  person David    schedule 23.06.2020
comment
Если я уже вошел в систему через компонент TWebBrowser, нет ли способа отправить через него запрос на загрузку? Все, что я вижу, требует отдельного компонента или какого-то действительно запутанного способа сделать это. Мне просто нужен эквивалент щелчка правой кнопкой мыши - ›Сохранить как ... Я не хочу иметь дело со страницей входа в систему каждый раз, когда мы загружаем файл.   -  person David    schedule 25.06.2020


Ответы (1)


Вы можете использовать этот подход для автоматического входа в систему (при необходимости): Автоматический вход (веб-браузер)

Затем вы можете использовать это, чтобы получить изображение: Изображение из TWebBrowser в TPicture

person L Q    schedule 03.07.2020
comment
Первая часть выглядит так, как будто она вполне может сработать; Я должен попробовать. Но все продолжают указывать мне на одни и те же примеры, в которых используется устаревший API DrawToDC, который НЕ работает. Я хотел бы увидеть, что использовать вместо него, а не более 100 строк запутанного кода. Обычно, когда функция устарела, она заменяется другой функцией, которая делает то же самое с другими параметрами или немного другим подходом. Все, что я видел, - это десятки строк кода, в которых используются малоизвестные части API, для которых практически нет документации, которую я могу найти. У DrawToDC нет простой замены? - person David; 08.08.2020