1. Do you speak English? Use the English version of the site! Link
    Скрыть объявление
Скрыть объявление
Здравствуй гость! После регистрации на ресурсе, ты сможешь скачивать материалы с форума и участвовать в его жизни! Для регистрации откройте соответствующую форму или нажмите на эту ссылку.

Делаем скрин элемента в webbrowser элемент в c#

Тема в разделе "Статьи", создана пользователем AnGel, 09.10.2015.

  1. AnGel

    AnGel Администратор
    Команда форума

    Дек 06 2016 в 18:54
    Регистрация:
    27.08.2015
    Сообщения:
    1.788
    Симпатии:
    1.306
    Делаем скрин элемента в webbrowser элемент с помощью ИРГФ.
    При использовании стандартного метода бывают лаги в работе, данный класс работает отлично.
    Сделал очень маленький допил:
    Добавил, что если элемент во фрейме добавляем смещения полученные функциями getXoffset и getYoffset к смещению элемента.

    Код:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Threading;
    namespace WebBrowserGetImage
    {
        class HTMLImageCap
        {
               [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
        //use win32 api
        private class Gdi32
        {
            [DllImport("gdi32.dll")]
            public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop);
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
            [DllImport("gdi32.dll")]
            public static extern bool DeleteDC(IntPtr hDC);
            [DllImport("gdi32.dll")]
            public static extern bool DeleteObject(IntPtr hObject);
            [DllImport("gdi32.dll")]
            public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
        }
        private static class User32
        {
            [DllImport("user32.dll")]
            public static extern IntPtr GetDesktopWindow();
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowDC(IntPtr hWnd);
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
            [DllImport("user32.dll")]
            public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
        }
        //define constants
        private const int SRCCOPY = 13369376;
        private const int LOOPTIMES = 40;
        private const int SLEEPTIME = 100;
        /*private*/ public static int getXoffset(HtmlElement he)
        {
            //get element pos
            int xPos = he.OffsetRectangle.Left;
            //get the parents pos
            HtmlElement tempEl = he.OffsetParent;
            while (tempEl != null)
            {
                xPos += tempEl.OffsetRectangle.Left;
                tempEl = tempEl.OffsetParent;
            }
            return xPos;
        }
        /*private */public static int getYoffset(HtmlElement he)
        {
            //get element pos
            int yPos = he.OffsetRectangle.Top;
            //get the parents pos
            HtmlElement tempEl = he.OffsetParent;
            while (tempEl != null)
            {
                yPos += tempEl.OffsetRectangle.Top;
                tempEl = tempEl.OffsetParent;
            }
            return yPos;
        }
        private static Image captureWindow(IntPtr handle, int x, int y, int width, int height)
        {
            IntPtr hdcSrc = User32.GetWindowDC(handle);
            RECT windowRect = new RECT();
            User32.GetWindowRect(handle, ref windowRect);
            IntPtr hdcDest = Gdi32.CreateCompatibleDC(hdcSrc);
            IntPtr hBitmap = Gdi32.CreateCompatibleBitmap(hdcSrc, width, height);
            IntPtr hOld = Gdi32.SelectObject(hdcDest, hBitmap);
            Gdi32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, x, y, SRCCOPY);
            Gdi32.SelectObject(hdcDest, hOld);
            Gdi32.DeleteDC(hdcDest);
            User32.ReleaseDC(handle, hdcSrc);
            Image img = Image.FromHbitmap(hBitmap);
            Gdi32.DeleteObject(hBitmap);
            return img;
        }
      
      //сделал допил, что если элемент во фреме, прибавляем и его смещения
        public static Image getImage(WebBrowser wb, HtmlElement he, int FramesOffsetX, int FramesOffsetY)
        {
            //get original scroll position
            int docY = wb.Document.GetElementsByTagName("HTML")[0].ScrollTop;
            int docX = wb.Document.GetElementsByTagName("HTML")[0].ScrollLeft;
            //scroll to view element
            wb.Document.Window.ScrollTo(getXoffset(he), getYoffset(he));
            int heY = getYoffset(he) - wb.Document.GetElementsByTagName("HTML")[0].ScrollTop;
            int heX = getXoffset(he) - wb.Document.GetElementsByTagName("HTML")[0].ScrollLeft;
            int heWidth = he.OffsetRectangle.Width;
            int heHeight = he.OffsetRectangle.Height;
            heX += FramesOffsetX;
            heY += FramesOffsetY;
            Image img = captureWindow(wb.Handle, heX, heY, heWidth, heHeight);
            //scroll back tooriginal position
            wb.Document.Window.ScrollTo(docX, docY);
            return img;
        }
        }
    }
    Вызов функции:

    Код:
    Image i = HTMLImageCap.getImage(webBrowser1, htmlElement, frOffsetX, frOffsetY);
     
    GM`ka нравится это.
  2. GM`ka

    GM`ka Кодер
    Команда форума

    Дек 06 2016 в 17:45
    Регистрация:
    13.09.2015
    Сообщения:
    232
    Симпатии:
    154
    Красавчек
     
  3. TRITON

    TRITON Новорег

    Нояб 06 2016 в 14:11
    Регистрация:
    20.10.2015
    Сообщения:
    3
    Симпатии:
    1
    А где это может понадобиться?