Картинка из Webbrowser/

Тема в разделе "Другие языки", создана пользователем elcaste, 4 янв 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Имеется VB.NET.
    Каким образом можно выдрать отрендеренную картинку из контрола Webbrowser или, на крайний случай, сделать snapshot всей загруженной страницы?
     
  2. tonsils

    tonsils Создатель

    Регистр.:
    2 янв 2008
    Сообщения:
    47
    Симпатии:
    20
    У веббраузера есть свойство Document, а у него - метод GetElementsByTagName
    Если параметром задать "img", он выгребет со страницы все ссылки на картинки. Дальше только скачать.
    Есть пример на с#, но идея, думаю, понятна:

    Код:
    System.Net.WebClient wc = new System.Net.WebClient();  
    HtmlElementCollection imgs = this.webBrowser1.Document.GetElementsByTagName("img");
    for (int i = 0; i < imgs.Count; i++)  {
      wc.DownloadFile(imgs[i].GetAttribute("src"), "c:\\images" + i.ToString() + ".jpg");  
    }
     
  3. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Это я знаю, и этот метод отлично подходит со статичной картинкой, но если она при каждом обновлении меняется то...
    Нужно достать именно ту, которая загрузилась в контрол.
     
  4. tonsils

    tonsils Создатель

    Регистр.:
    2 янв 2008
    Сообщения:
    47
    Симпатии:
    20
    Тогда наверное проще всего сохранить страницу в битмап:

    Код:
    int width = webBrowser1.Document.Body.ScrollRectangle.Width;
    int height = webBrowser1.Document.Body.ScrollRectangle.Height;
    
    Bitmap bmp = new Bitmap(width, height);
    
    webBrowser1.DrawToBitmap(bmp, new Rectangle(0, 0, width, height));
     
  5. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Такого метода у моего контрола нет даже близко...
    Стоит VB.NET 2008 Express.
     
  6. tonsils

    tonsils Создатель

    Регистр.:
    2 янв 2008
    Сообщения:
    47
    Симпатии:
    20
    Да, MSDN говорит что метод не поддерживается и в редакторе его не подсказывает. Но метод реализован и у меня (VS 2008) компилится и работает.

    Думаю в VB тоже должен работать, если правильно описать:

    Dim wb As WebBrowserBase
    Dim bitmap As Bitmap
    Dim targetBounds As Rectangle

    wb.DrawToBitmap(bitmap, targetBounds)

    Ну а на крайний случай можно заюзать апишные функции, как здесь:
    http://bytes.com/groups/net-c/605264-taking-screenshot-webbrowser-tab
     
    elcaste нравится это.
  7. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    Работает! :)
    Премного благодарен.
    А вот как быть с конкретной картинкой на странице...
    Можно, если получить ее координаты на странице и размеры, то можно сфотографировать тем же DrawToBitmap, но где их взять? Или может есть проще способ?
     
  8. tonsils

    tonsils Создатель

    Регистр.:
    2 янв 2008
    Сообщения:
    47
    Симпатии:
    20
    Координаты картинки на странице так просто взять не получится, их браузер высчитывает сам и никому не говорит :)
    А почему нельзя загружать картинку по ссылке? Вроде самый естественный способ...
     
  9. elcaste

    elcaste

    Регистр.:
    30 ноя 2007
    Сообщения:
    322
    Симпатии:
    175
    C капчами так не получится :) Точнее получится, но тогда с запросом капчи нужно слать куки и еще там есть нюансы.
    Уже есть PHP скрипт, который работает с сайтами на "текстовом уровне", т.е. от запроса к запросу. В том же Xedant Human Emulator как то изображение забирают...
     
  10. tonsils

    tonsils Создатель

    Регистр.:
    2 янв 2008
    Сообщения:
    47
    Симпатии:
    20
    В принципе, если сайт один и тот же, можно просто посчитать координаты капчи на скриншоте и выдирать ее :)

    Просто разбираться с загруженными в браузер рисунками - тот еще гемор. Браузер может их оставлять в памяти, может сохранять в кэш. Может и переименовать, если такой же файл уже есть...
     
Статус темы:
Закрыта.