Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > WebBrowser - сохранить изображение


Автор: infarch 18.4.2011, 14:47
На форме у меня 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");
                }
            }
        }



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

Автор: nikitao 18.4.2011, 17:00
Код


[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;
            }
        }

Автор: infarch 18.4.2011, 17:31
А чем это отличается от того что я писал? Функционал вынесен в отдельную функцию, круто, а суть-то та самая. И получаю тот самый пустой файл. Пустой это не значит 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");
            }
        }




Автор: nikitao 18.4.2011, 21:25
Это странно , но вот этот код 

Код

 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

Автор: infarch 19.4.2011, 11:43
Ну а у меня и того нет, как ни крути, а получаю пустышку. Скопипастил ваш код один в один и ничего :( Прямо хоть принтскрин с монитора делай. А вы на какой системе пробуете? У меня семерка х64 и компилирую для дотнета 4.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)