C#通过WebBrowser对网页截图

10 篇文章 0 订阅
这篇博客介绍了如何利用C#的WebBrowser控件创建一个WebSnapshotsHelper类,用于抓取网页快照。类中包含了超时处理、屏幕偏移量设置以及不显示脚本错误弹窗的功能。通过指定网页URL、浏览器窗口大小、截图尺寸和偏移量,可以自定义生成所需网页快照,并将其保存为图片文件。
摘要由CSDN通过智能技术生成

文档参考:

https://www.cnblogs.com/zuqing/p/5698060.html

在此基础上对其进行了部分优化,增加了超时处理、偏移量、不显示脚本弹窗处理

项目引用程序集:

Microsoft.mshtml

System.Windows.Forms.dll

创建WebSnapshotsHelper类

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace WebSnapshots
{
    public class WebSnapshotsHelper
    {
        Bitmap m_Bitmap;
        string m_Url;
        int m_BrowserWidth, m_BrowserHeight, m_SnapWidth, m_SnapHeight;
        int m_OffsetX, m_OffsetY;
        int m_Timeout;
        private WebSnapshotsHelper(string Url, int BrowserWidth, int BrowserHeight, int SnapWidth, int SnapHeight, int OffsetX, int OffsetY, int Timeout)
        {
            m_Url = Url;
            m_BrowserHeight = BrowserHeight;
            m_BrowserWidth = BrowserWidth;
            m_SnapWidth = SnapWidth;
            m_SnapHeight = SnapHeight;
            m_OffsetX = OffsetX;
            m_OffsetY = OffsetY;
            m_Timeout = Timeout;
        }

        /// <summary>
        /// GetWebSiteThumbnail
        /// </summary>
        /// <param name="Url">目标网络地址</param>
        /// <param name="BrowserWidth">浏览器宽度</param>
        /// <param name="BrowserHeight">浏览器高度</param>
        /// <param name="SnapWidth">截图的宽度</param>
        /// <param name="SnapHeight">截图的高度</param>
        /// <param name="OffsetX">截图偏移量,从左边X处开始截图</param>
        /// <param name="OffsetY">截图偏移量,从上边Y处开始截图</param>
        /// <param name="Timeout">超过N秒后即超时,Bitmap返回null</param>
        /// SnapWidth+OffsetX不能大于SnapWidth,SnapHeight+OffsetY不能大于SnapHeight
        /// <returns></returns>
        public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int SnapWidth, int SnapHeight, int OffsetX=0,int OffsetY=0,int Timeout=60)
        {
            WebSnapshotsHelper thumbnailGenerator = new WebSnapshotsHelper(Url, BrowserWidth, BrowserHeight, SnapWidth, SnapHeight, OffsetX, OffsetY, Timeout);
            return thumbnailGenerator.GenerateWebSiteThumbnailImage();
        }
        private Bitmap GenerateWebSiteThumbnailImage()
        {
            Thread m_thread = new Thread(new ThreadStart(_GenerateWebSiteSnapImage));
            m_thread.SetApartmentState(ApartmentState.STA);
            m_thread.Start();
            m_thread.Join();
            return m_Bitmap;
        }
        private void _GenerateWebSiteSnapImage()
        {
            WebBrowser m_WebBrowser = new WebBrowser();
            m_WebBrowser.ScrollBarsEnabled = false;
            //获取或设置一个值,该值指示 WebBrowser 是否显示对话框,如脚本错误消息。
            //如果控件不显示其对话框,则为 true;否则为 false。 默认值为 false。
            m_WebBrowser.ScriptErrorsSuppressed = true;
            m_WebBrowser.Navigate(m_Url);
            m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);

            DateTime dateFrom = DateTime.Now;
            DateTime dateTo;
            while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete || m_WebBrowser.IsBusy)
            {
                dateTo = DateTime.Now;
                if ((dateTo - dateFrom).TotalSeconds < m_Timeout)
                {
                    Application.DoEvents();
                }
                else
                {
                    break;
                }
            }
            m_WebBrowser.Dispose();
        }
        private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser m_WebBrowser = (WebBrowser)sender;
            m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth, this.m_BrowserHeight);
            m_WebBrowser.ScrollBarsEnabled = false;
            m_Bitmap = new Bitmap(m_BrowserWidth, m_BrowserHeight);
            m_WebBrowser.BringToFront();
            m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds);
            Rectangle rClipRect = new Rectangle(m_OffsetX, m_OffsetY, m_SnapWidth, m_SnapHeight);
            m_Bitmap = m_Bitmap.Clone(rClipRect, m_Bitmap.PixelFormat);
            m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(m_SnapWidth, m_SnapHeight, null, IntPtr.Zero);
            
        }

    }
}

测试用例:

url = "http://www.cnblogs.com/";
Bitmap m_Bitmap = WebSnapshotsHelper.GetWebSiteThumbnail(url, 1920, 1080, 1000, 580, 0, 0, 60); //宽高根据要获取快照的网页决定
m_Bitmap.Save("snap_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); //图片格式可以自由控制
m_Bitmap.Dispose();
System.Diagnostics.Process.Start("snap_image.jpg");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值