当前位置:网站首页>C#通过WebBrowser对网页截图
C#通过WebBrowser对网页截图
2022-08-03 05:27:00 【谷凯Jump】
文档参考:
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");
边栏推荐
猜你喜欢
Delightful Nuxt3 Tutorial (2): Build a Blog Quickly and Easily
全球一流医疗技术公司如何最大程度提高设计工作效率 | SOLIDWORKS 产品探索
ZEMAX | 如何围绕空间中的任何点旋转任何元素
增强光学系统设计 | Zemax 全新 22.2 版本产品现已发布!
VS2022 encapsulates static libraries and calls static libraries under window
基于南航app直减自动出票
What is parametric design, let's understand it through practical operation?| SOLIDWORKS How-To Videos
移动端人脸风格化技术的应用
ZEMAX | 在设计抬头显示器(HUD)时需要使用哪些工具?
appium(3)webview测试
随机推荐
二分查找6 - 寻找峰值
3D建模:做什么副业在家就能月入1W?
【面试】摸鱼快看:关于selenium/ui自动化的面试题
阿里云短信服务的使用(创建,测试笔记)
C#切换输入法
二分查找4 - 搜索旋转排序数组
守望先锋英雄角色模型分享,obj文件+材质贴图,3dmax游戏建模
Oracle 11g静默安装
ZBrush+Substance Designer2021制作高品质3D角色模型全流程!
All-round interpretation of POE switches (middle)
一文看懂常见域名后缀的含义
【面筋1】一些没什么标准答案的问题
权限管理 UGO 、 ACL 、特殊权限
六、对比Vector、ArrayList、LinkedList有何区别?(设计、性能、安全)
剑指 Offer II 001. 整数除法
How the world's leading medical technology company maximizes design productivity | SOLIDWORKS Product Exploration
五、int和Integer有什么区别?
各种cms getshell技巧
【记录】把json的所有key转换成小写
SQLMAP介绍及使用