C# 使用 WebBrowser 实现 HTML 转图片功能的示例代码

在 .NET 平台上,我们有多种方式可以将一段 HTML 文本转换为一张图片:HTML RendererSelectPdfAspose.Html等。

在 WinForm 程序中,每一个 System.Windows.Forms.Control 的派生类型均包含一个名为 DrawToBitmap 的方法,该方法可以将控件绘制到一张图片上。WebBrowser 具备显示 HTML 的功能,又因为其从 Control 类型派生,所以包含 DrawToBitmap 方法。我们只需将要在 WebBrowser 上加载要展示的 HTML 并在其 DocumentCompleted 事件中绘制图片即可:

public static async Task<Image> HtmlToImage(String html, int width = 1024, int height = 768)
{
  var taskCompletionSource = new TaskCompletionSource<Image>();
  var thread = new Thread(() =>
  {
    using var browser = new WebBrowser
    {
      Width = width,
      Height = height,
      ScrollBarsEnabled = false
    };
    browser.DocumentCompleted += (s, e) =>
    {
      var b = s as WebBrowser;
      if (b == null)
      {
        return;
      }
      var bmp = new Bitmap(b.Width, b.Height);
      b.DrawToBitmap(bmp, new Rectangle(0, 0, b.Width, b.Height));
      taskCompletionSource.SetResult(bmp);
      Application.ExitThread();
    };
    browser.DocumentText = html;
    Application.Run();
  });
  thread.SetApartmentState(ApartmentState.STA);
  thread.Start();
  return await taskCompletionSource.Task;
}

以上代码参考了:Stack Overflow,笔者将其改造为异步方法并增加了必要的释放功能。在 LINQPad 中测试效果如下:

该方式的优点:

  1. 简单易用。
  2. 支持最新的 .NET Core 环境。
  3. 无需引用第三方类库,没有版权和安全性风险,安全且免费。
  4. 支持从互联网上加载内容。

该方式的缺点:

  1. 虽然支持 .NET Core ,但以上代码不能跨平台使用。
  2. WebBrowser 控件基于 IE 浏览器并受宿主操作系统影响,要求被呈现的网页具备较高的兼容性。

使用 IE8+ 版本进行渲染

笔者在实际工作中使用到了部分 CSS3 属性,默认情况下 WebBrowser 使用低版本的 IE 浏览器渲染网页,这会导致部分网页效果不生效,比如隔行变色效果。除了修改注册表,我们仍可以通过在网页中加入 meta 标签的方式告知 WebBrowser 使用高版本的 IE 浏览器进行渲染,仅需将以下代码复制至 HTML 的 head 标签内即可:

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

以上就是C# 使用 WebBrowser 实现 HTML 转图片功能的实例代码的详细内容,更多关于C# WebBrowser 实现 HTML 转图片的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#自写的一个HTML解析类(类似XElement语法)

    功能: 1.轻松获取指元素HTML元素. 2.可以根据属性标签进行筛选 3.返回的都是Llist强类型无需转换 用过XElement的都知道 用来解析XML非常的方便,但是对于HTML的格式多样化实在是没办法兼容. 所以我就写了这么一个类似XElement的 XHTMLElement 用法: string filePath = Server.MapPath("~/file/test.htm"); //获取HTML代码 string mailBody = FileHelper.FileT

  • 利用C#代码将html样式文件与Word文档互换的方法

    一.C#代码将html样式文件转为Word文档 首先有个这样的需求,将以下网页内容下载为Word文件. html代码: <div class="modal-body"> <div style="height:600px;width:550px; margin:0 auto;"> <table style="border-collapse:separate;border-spacing:10px;width: 100%"

  • c#使用nsoup解析html乱码解决方法分享 nsoup教程

    下载地址:http://nsoup.codeplex.com/ 简单用法如下: 复制代码 代码如下: NSoup.Nodes.Document doc = NSoup.NSoupClient.Parse(HtmlString); 处理网络上的页面: 复制代码 代码如下: NSoup.Nodes.Document doc = NSoup.NSoupClient.Connect("http://www.jb51.net/").Get(); 但是遗憾的是NSoup默认的编码是UTF-8,处理

  • c# 使用HtmlAgilityPack解析Html

    HtmlAgilityPack 是一个开源的快速解析Html的C#类库.简单理解,它可以像解析Xml一样,将Html根据XPATH转化为一个个Node节点,并支持调整节点以及节点的各种属性. 传送门:官网 | Github源码 多种方式加载Html 主要加载方式有3类:从网络链接加载.从字符串文本中加载.从文件加载 var doc = new HtmlDocument(); //直接通过url加载 doc = new HtmlWeb().Load("https://www.baidu.com/&

  • C#基于正则表达式抓取a标签链接和innerhtml的方法

    本文实例讲述了C#基于正则表达式抓取a标签链接和innerhtml的方法.分享给大家供大家参考,具体如下: //读取网页html string text = File.ReadAllText(Environment.CurrentDirectory + "//test.txt", Encoding.GetEncoding("gb2312")); string prttern = "<a(\\s+(href=\"(?<url>([

  • C#正则过滤HTML标签并保留指定标签的方法

    本文实例讲述了C#正则过滤HTML标签并保留指定标签的方法.分享给大家供大家参考,具体如下: 这边主要看到一个过滤的功能: public static string FilterHtmlTag(string s) { //<...>标记正则表达式 return Regex.Replace(s, @"<[^>]*>", delegate(Match match) { string v = match.ToString(); //图片,<p>,&l

  • C#抓取网页数据 解析标题描述图片等信息 去除HTML标签

    一.首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下: 复制代码 代码如下: private static string GetPageData(string url) {     if (url == null || url.Trim() == "")         return null;     WebClient wc = new WebClient();     wc.Credentials

  • C#下解析HTML的两种方法介绍

    在搜索引擎的开发中,我们需要对Html进行解析.本文介绍C#解析HTML的两种方法.AD: 在搜索引擎的开发中,我们需要对网页的Html内容进行检索,难免的就需要对Html进行解析.拆分每一个节点并且获取节点间的内容.此文介绍两种C#解析Html的方法. C#解析Html的第一种方法:用System.Net.WebClient下载Web Page存到本地文件或者String中,用正则表达式来分析.这个方法可以用在Web Crawler等需要分析很多Web Page的应用中.估计这也是大家最直接,

  • 通过C#实现发送自定义的html格式邮件

    要发送HTML格式邮件,需要设置MailMessage对象的IsBodyHtml属性,设置为true. 类MailMessage在命名空间System.Net.Mail下. using System.Net.Mail; 发送HTML格式的邮件在HoverTreeTop项目中已经实现,并发送成功. 需依赖于HoverTreeFrame项目的HoverTreeEmail类. 方法为: 复制代码 代码如下: public static string HoverTreeSendEmail(string

  • c#使用htmlagilitypack解析html格式字符串

    使用方法: 1.引用HtmlAgilityPack.dll文件 2.引用命名空间: 复制代码 代码如下: using HtmlAgilityPack; 3.调用 复制代码 代码如下: static void Main(string[] args)        {            string html = GetHtml("http://www.jb51.net");            HtmlDocument doc = new HtmlDocument();      

随机推荐