Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WebBrowser - сохранить изображение 
:(
    Опции темы
infarch
Дата 18.4.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



На форме у меня WebBrowser и кнопка. По нажатию кнопки мне нужно сделать скриншот с браузера и сохранить в файл. Уже пол дня гуглю и ничего хорошего не выходит :(

Вот последняя попытка:

Код

        [Flags]
        private enum DrawingOptions
        {
            PRF_CHECKVISIBLE = 0x00000001,
            PRF_NONCLIENT = 0x00000002,
            PRF_CLIENT = 0x00000004,
            PRF_ERASEBKGND = 0x00000008,
            PRF_CHILDREN = 0x00000010,
            PRF_OWNED = 0x00000020
        }

        private const uint WM_PAINT = 0xF;

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr dc, DrawingOptions opts);

        private void button2_Click(object sender, EventArgs e)
        {
            using (Bitmap bm = new Bitmap(browser.Width, browser.Height))
            {
                using (Graphics g = Graphics.FromImage(bm))
                {
                    IntPtr dc = g.GetHdc();
                    try
                    {
                        SendMessage(browser.Handle, WM_PAINT, dc,
                        DrawingOptions.PRF_CLIENT |
                        DrawingOptions.PRF_NONCLIENT |
                        DrawingOptions.PRF_CHILDREN);
                    }
                    finally
                    {
                        g.ReleaseHdc();
                    }
                    bm.Save(@"C:\1.bmp");
                }
            }
        }



Сохраняется пустой файл. Подскажите пожалуйста решение!

PM MAIL   Вверх
nikitao
Дата 18.4.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Код


[Flags]
        private enum DrawingOptions
        {
            PRF_CHECKVISIBLE = 0x00000001,
            PRF_NONCLIENT = 0x00000002,
            PRF_CLIENT = 0x00000004,
            PRF_ERASEBKGND = 0x00000008,
            PRF_CHILDREN = 0x00000010,
            PRF_OWNED = 0x00000020
        }


        [DllImport("user32.dll")]
        private static extern int SendMessage(IntPtr hWnd, int msg, IntPtr dc,
            DrawingOptions opts);
/// <summary>
        ///  Возвращает скриншот контрола
        /// </summary>
        /// <param name="control"></param>
        /// <returns></returns>
        public static Bitmap GetImageControl(Control control)
        {
            try
            {
                Bitmap bm = new Bitmap((int)control.Width + 1, (int)control.Height + 1);
                using (Graphics g = Graphics.FromImage(bm))
                {
                    IntPtr dc = g.GetHdc();
                    try
                    {
                        SendMessage(control.Handle, WM_PRINT, dc,
                            DrawingOptions.PRF_CHILDREN |
                            DrawingOptions.PRF_CLIENT |
                            DrawingOptions.PRF_NONCLIENT);
                    }
                    finally
                    {
                        g.ReleaseHdc(dc);
                    }
                }
                return bm;
            }
            catch
            {
                return null;
            }
        }



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
infarch
Дата 18.4.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



А чем это отличается от того что я писал? Функционал вынесен в отдельную функцию, круто, а суть-то та самая. И получаю тот самый пустой файл. Пустой это не значит 0 байт, линейные размеры его те-же что и у браузера и весит около 6 килобайт. Изображения нет, вот проблема. Вот как это сейчас у меня выглядит:

Код

        [Flags]
        private enum DrawingOptions
        {
            PRF_CHECKVISIBLE = 0x00000001,
            PRF_NONCLIENT = 0x00000002,
            PRF_CLIENT = 0x00000004,
            PRF_ERASEBKGND = 0x00000008,
            PRF_CHILDREN = 0x00000010,
            PRF_OWNED = 0x00000020
        }

        private const int WM_PAINT = 0xF;

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hWnd, int msg, IntPtr dc, DrawingOptions opts);

        public static Bitmap GetImageControl(Control control)
        {
            try
            {
                Bitmap bm = new Bitmap((int)control.Width + 1, (int)control.Height + 1);
                using (Graphics g = Graphics.FromImage(bm))
                {
                    IntPtr dc = g.GetHdc();
                    try
                    {
                        SendMessage(control.Handle, WM_PAINT, dc,
                            DrawingOptions.PRF_CHILDREN |
                            DrawingOptions.PRF_CLIENT |
                            DrawingOptions.PRF_NONCLIENT);
                    }
                    finally
                    {
                        g.ReleaseHdc(dc);
                    }
                }
                return bm;
            }
            catch (Exception e)
            {
                String msg = e.Message;
                return null;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Bitmap bm = GetImageControl(browser);
            if (bm != null)
            {
                bm.Save(@"C:\1.bmp");
                MessageBox.Show("Done");
            }
        }





Это сообщение отредактировал(а) infarch - 18.4.2011, 17:37
PM MAIL   Вверх
nikitao
Дата 18.4.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Это странно , но вот этот код 

Код

 WebBrowser browser = new System.Windows.Forms.WebBrowser();
                browser.Width = 640;
                browser.Height = 480;
                browser.Navigate(new Uri("http://forum.vingrad.ru"));
                Application.DoEvents();
                while (browser.ReadyState != WebBrowserReadyState.Complete)
                    Application.DoEvents();
                browser.Width = browser.Document.Body.ScrollRectangle.Width;
                browser.Height = browser.Document.Body.ScrollRectangle.Height;
                Bitmap bm =  GetImageControl(browser);
                browser.Dispose();
                bm.Save("D:\\img.jpg");


У меня дает картинку с изображением.
Но если я прошу сохранить вебраузер , который уже загружен с каким то адресом , то как вы и описываете получаю пустой image


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
infarch
Дата 19.4.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Ну а у меня и того нет, как ни крути, а получаю пустышку. Скопипастил ваш код один в один и ничего :( Прямо хоть принтскрин с монитора делай. А вы на какой системе пробуете? У меня семерка х64 и компилирую для дотнета 4.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.