在 .NET 平台上,咱们有多种方式能够将一段 HTML 文本转换为一张图片:HTML Renderer、SelectPdf 、Aspose.Html 等。html
在 WinForm 程序中,每个 System.Windows.Forms.Control
的派生类型均包含一个名为 DrawToBitmap
的方法,该方法能够将控件绘制到一张图片上。WebBrowser 具有显示 HTML 的功能,又由于其从 Control 类型派生,因此包含 DrawToBitmap
方法。咱们只需将要在 WebBrowser 上加载要展现的 HTML 并在其 DocumentCompleted
事件中绘制图片便可:git
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 中测试效果以下:github
笔者在实际工做中使用到了部分 CSS3 属性,默认状况下 WebBrowser 使用低版本的 IE 浏览器渲染网页,这会致使部分网页效果不生效,好比隔行变色效果。除了修改注册表,咱们仍能够经过在网页中加入 meta
标签的方式告知 WebBrowser 使用高版本的 IE 浏览器进行渲染,仅需将如下代码复制至 HTML 的 head 标签内便可:浏览器
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>