Захватывать часть веб-страницы, как изображение в WPF?


Мне просто интересно, возможно ли как-тозахватить часть веб-страницы, как изображение в WPF ?

Спасибо!

2 2

2 ответа:

Для WinForms я сделал что-то вроде того, что вы хотите. Вот фрагмент кода . Я думаю, вы можете легко сделать это с WPF таким же образом, тоже.

В основном это процедура, чтобы захватить веб-сайт в виде скриншота и сохранить его на изображение. В настоящее время он работает только в том случае, если страница помещается на одном экране, он не может прокручивать или делать другие причудливые вещи.

Прежде всего, спасибо @Uwe Keim !!!!

Поэтому я использовал его код, чтобы сделать то, что мне нужно: захватить и обрезать любую часть управления WebBrowser.
  1. сам код (он должен быть реализован как DLL.)

Тест пространства имен {

Использование Системы;

Использование Системы.Диагностика;

    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;


public class WebBrowserScreenshotCapture
{
    private class FocuslessForm : Form { }

    public void CaptureBrowserScreenshot(Uri url, FileInfo saveAsFilePath, Point scrollTo, Rectangle cropToRectangle)
    {
        var sb = Math.Max(SystemInformation.VerticalScrollBarWidth,SystemInformation.HorizontalScrollBarHeight);

        var size = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);

        using (var form =
            new FocuslessForm
            {
                Width = size.Width + sb,
                Height = size.Height + sb,
                Padding = new Padding(0),
                Margin = new Padding(0),
                FormBorderStyle = FormBorderStyle.None,
                Opacity = 0,
                TabStop = false,
                ShowInTaskbar = false
            })
        {
            var webBrowser1 =   new WebBrowser
                {
                    Padding = new Padding(0),
                    Margin = new Padding(0),
                    Dock = DockStyle.Fill,
                    Url = url,
                    TabStop = false
                };
            form.Controls.Add(webBrowser1);

            var finished = false;

            webBrowser1.DocumentCompleted += delegate { webBrowser1.Document.Window.ScrollTo(scrollTo); finished = true; };

            form.Show();

            while (!finished)
            {
                Application.DoEvents();
            }

            CaptureBrowserScreenshot(webBrowser1, saveAsFilePath, cropToRectangle);
            form.Close();
        }
    }

    public void CaptureBrowserScreenshot(WebBrowser webBrowser, FileInfo saveAsFilePath,  Rectangle cropToRectangle)
    {
        using (var screenshot = new Bitmap(webBrowser.ClientSize.Width,  webBrowser.ClientSize.Height))
        {
            getImage(webBrowser.ActiveXInstance, screenshot, Color.White);

            using (var effectiveImage = new Bitmap(webBrowser.ClientSize.Width - SystemInformation.VerticalScrollBarWidth, webBrowser.ClientSize.Height - SystemInformation.HorizontalScrollBarHeight))
            {
                using (var graphics = Graphics.FromImage(effectiveImage))
                {
                    graphics.DrawImageUnscaled(screenshot, 0, 0);
                }

                using (var croppedImage = cropImage(effectiveImage, cropToRectangle))
                {
                    croppedImage.Save(saveAsFilePath.FullName, getImageFormatFromFileExtension(saveAsFilePath.Extension));
                }   
            }
        }
    }       

    private static Image cropImage(Bitmap image, Rectangle cropRect)
    {
        var effectiveImage = new Bitmap(cropRect.Width,cropRect.Height);

        using (var graphics = Graphics.FromImage(effectiveImage))
        {
            graphics.DrawImage(image, 0, 0, cropRect, GraphicsUnit.Pixel);
        }

        return effectiveImage;
    }    

    private static bool needReduceSizeProportionally(Image image,int maxWidth,  int maxHeight)
    {
        if (image == null)
        {
            return false;
        }
        else
        {
            if (image.Width <= maxWidth && image.Height <= maxHeight)
            {
                // Nothing to do.
                return false;
            }
            else
            {
                return true;
            }
        }
    }

    private static ImageFormat getImageFormatFromFileExtension(string extension)
    {
        extension = extension.Trim('.').ToLowerInvariant();

        ImageFormat format;
        switch (extension)
        {
            case @"bmp":
                format = ImageFormat.Bmp;
                break;

            case @"png":
                format = ImageFormat.Png;
                break;

            case @"gif":
                format = ImageFormat.Gif;
                break;

            case @"jpg":
            case @"jpeg":
                format = ImageFormat.Jpeg;
                break;

            case @"tif":
            case @"tiff":
                format = ImageFormat.Tiff;
                break;

            default:
                Trace.WriteLine(
                    string.Format(
                        @"Unknown file format extension '{0}'. Using PNG instead.",
                        extension));
                format = ImageFormat.Png;
                break;
        }

        return format;
    }

    [ComImport]
    [Guid(@"0000010D-0000-0000-C000-000000000046")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    private interface IViewObject
    {
        void Draw([MarshalAs(UnmanagedType.U4)] uint dwAspect, int lindex, IntPtr pvAspect, [In] IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [MarshalAs(UnmanagedType.Struct)] ref RECT lprcBounds, [In] IntPtr lprcWBounds, IntPtr pfnContinue, [MarshalAs(UnmanagedType.U4)] uint dwContinue);
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    private struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    private static void getImage(object obj, Image destination, Color backgroundColor)
    {
        using (var graphics = Graphics.FromImage(destination))
        {
            var deviceContextHandle = IntPtr.Zero;
            var rectangle = new RECT { Right = destination.Width, Bottom = destination.Height };

            graphics.Clear(backgroundColor);

            try
            {
                deviceContextHandle = graphics.GetHdc();

                var viewObject = (IViewObject)obj;
                viewObject.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, deviceContextHandle, ref rectangle, IntPtr.Zero, IntPtr.Zero, 0);
            }
            finally
            {
                if (deviceContextHandle != IntPtr.Zero)
                {
                    graphics.ReleaseHdc(deviceContextHandle);
                }
            }
        }
    }
}

}

  1. Как им пользоваться.

    WebBrowserScreenshotCapture c = new WebBrowserScreenshotCapture ();

    Точка scrollWebpageTo = новая точка(0, 300);

    C. CaptureBrowserScreenshot (new Uri("http://website.com"), новая System. IO. FileInfo (@"D:\test.png"), scrollWebpageTo, новый прямоугольник (400,300,200,300));