C#, asp net.ajax разработка web-приложений, Javascript CSS
 
Задать вопрос asp.net ajax C#

Рубрики


Статьи


Подписка


Подписаться по RSS

Архив

 Полный архив по категориям

Популярные записи


Мои рекомендации



# Sunday, June 10, 2007

Оказывается сделать програмно картинку превьюшку любого сайта в интернете не так уж сложно. Для этого нужно создать объект webBrowser1 в роли которого выступит IE и снять с него скриншот.
Сначала навигация по URL и ожидание завершения загрузки.

   webBrowser.Navigate(url);
        while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }
Потом создаём картинку и рисуем на неё внешний вид сайта.
Bitmap bitmap = new Bitmap(width, height);
webBrowser1.DrawToBitmap(bitmap, 
    new Rectangle(webBrowser1.Location.X, webBrowser1.Location.Y, webBrowser1.Width, webBrowser1.Height));
Всё это можно аккуратно упаковать в класс WebPageBitmap в конструктор которого нужно передать URL и размены окна браузера . Потом вызовом GetBitmap мы получаем картинку которую можно сохранить на диске.
using System.Windows.Forms;
using System.Drawing;

namespace GetSiteThumbnail
{
    public class WebPageBitmap
    {
        private WebBrowser webBrowser;
        private string url;
        private int width;
        private int height;
        private bool isReady;

        public WebPageBitmap(string url, int width, int height, bool scrollBarsEnabled)
        {
            this.url = url;
            this.width = width;
            this.height = height;
            webBrowser = new WebBrowser();
            webBrowser.DocumentCompleted +=
                new WebBrowserDocumentCompletedEventHandler(documentCompletedEventHandler);
            webBrowser.Size = new Size(width, height);
            webBrowser.ScrollBarsEnabled = scrollBarsEnabled;
        }


        public bool IsReady
        {
            get { return isReady; }
        }

        public void Fetch()
        {
            webBrowser.Navigate(url);
            while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }
            
        }
        private void documentCompletedEventHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            isReady = true;
        }
        
        ~WebPageBitmap()
        {
/*            webBrowser.Dispose();
 */
        }

        public Bitmap GetBitmap(int thumbwidth, int thumbheight)
        {
            Bitmap bitmap = new Bitmap(width, height);
            Rectangle bitmapRect = new Rectangle(0, 0, width, height);
            webBrowser.DrawToBitmap(bitmap, bitmapRect);
            if (thumbheight == height && thumbwidth == width)
            {
                return bitmap;
            }
            else
            {
                Bitmap thumbnail = new Bitmap(thumbwidth, thumbheight);
                Graphics gfx = Graphics.FromImage(thumbnail);
                gfx.DrawImage(bitmap, new Rectangle(0,0, thumbwidth, thumbheight), bitmapRect,GraphicsUnit.Pixel);

                bitmap.Dispose();
                return thumbnail;
            }
        }
    }
}

PS. С web приложениями всё оказалось не так просто. В контексте w3wp webBrowser ругнулся:
"ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.", ему видите ли подавай single-threaded apartment. Проблама решилась написанием exe програмки которая в качестве входных параметров получала URL, размеры браузера и картинки а так же путь куда сохранять картинку и это дело запускалось новым процесом Process.Start().

Wednesday, June 20, 2007 4:08:07 AM (E. Europe Standard Time, UTC+02:00)
Поражает простота! :)
Friday, June 22, 2007 9:38:35 PM (E. Europe Standard Time, UTC+02:00)
Есть еще 1 нюанс в веб
В веб-приложении компонент webBrowser запустится от имени нетворксервиса и используются настройки веб-браузера по умолчанию: откл. яваскрипт, нет флеш-плеера... в общем сайты не в белом списке
Еше на хост площадках, допустим на мастерхосте, это дело не будет работать по пречине кика всего апликейшена IIS из-за большой нагрузки на проц в момент загрузки страницы (для некоторых страниц правда всетаки иногда получает скриншоты, например mail.ru, видимо для тех которые находятся на серверах сети мастерхоста)
Cab
Saturday, June 23, 2007 7:49:48 AM (E. Europe Standard Time, UTC+02:00)
Хехе, что бы пользоваться такой фичей нужно ставить свой сервер, а не пользоваться хостингом.
Saturday, June 23, 2007 2:04:59 PM (E. Europe Standard Time, UTC+02:00)
Ну свой сервер в зоне IDC не всегда подходит. Например если проект глобального значения... Можно конечно арендовать сервер. Но в некоторых случаях есть и другой выход. Например веб-приложение размещаем на хостинге, а у себя на сервере (или же просто на тачке) мутим вин-приложение, в котором веб-браузер уже будет работать под нужным юзером (под вами). А общаться вин-приложение с веб-приложением на сервере хостера (и с БД) будут через XML-интерфейс, картинку в томже xml можно передавать преобразовав byte[] в строку base64, например.
Cab
Comments are closed.