• C# 使用 WebBrowser 实现 HTML 转图片功能


    在 .NET 平台上,我们有多种方式可以将一段 HTML 文本转换为一张图片:HTML RendererSelectPdf Aspose.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"/>
     
  • 相关阅读:
    ssize_t与size_t的前世今生
    jQuery 中的事件参数传递机制
    链表的container_of 疑惑
    c 语言使用疑惑小记
    IQueryFilter的WhereClause详解
    给自己鼓励...
    什么是闭包,我的理解
    WCF 第五章 行为 为服务终结点行为实现一个消息检测器
    WCF 第五章 行为 事务之事务服务行为
    WCF 第四章 绑定 wsHttpBinding
  • 原文地址:https://www.cnblogs.com/Soar1991/p/13234891.html
Copyright © 2020-2023  润新知