Захватывать часть веб-страницы, как изображение в WPF?
Мне просто интересно, возможно ли как-тозахватить часть веб-страницы, как изображение в WPF ?
Спасибо!
2 ответа:
Для WinForms я сделал что-то вроде того, что вы хотите. Вот фрагмент кода . Я думаю, вы можете легко сделать это с WPF таким же образом, тоже.
В основном это процедура, чтобы захватить веб-сайт в виде скриншота и сохранить его на изображение. В настоящее время он работает только в том случае, если страница помещается на одном экране, он не может прокручивать или делать другие причудливые вещи.
Прежде всего, спасибо @Uwe Keim !!!!
Поэтому я использовал его код, чтобы сделать то, что мне нужно: захватить и обрезать любую часть управления WebBrowser.
- сам код (он должен быть реализован как 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); } } } } }
}
Как им пользоваться.
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));