2010-04-05 42 views
8

我拥有带有网址的字符串。例如“http://google.com”。将网页呈现为图片

是否有任何方式下载并渲染此页面到图片文件? (“test.jpg”)

我试图使用WebBrowser控件来下载和渲染图片,但它只在WebBrowser以显示的形式放置时才起作用。在其他方面,它只渲染黑色矩形。

但我想渲染图像而没有任何视觉效果(创建,激活形式等)

回答

9

Internet Explorer支持的IHtmlElementRenderer接口,提供给一个页面呈现为任意设备上下文。这是一个示例表单,向您展示如何使用它。开始项目+添加引用,选择Microsoft.mshtml

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     webBrowser1.Url = new Uri("http://stackoverflow.com"); 
     webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 
    } 

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
     if (!e.Url.Equals(webBrowser1.Url)) return; 
     // Get the renderer for the document body 
     mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument; 
     mshtml.IHTMLElement body = (mshtml.IHTMLElement)doc.body; 
     IHTMLElementRender render = (IHTMLElementRender)body; 
     // Render to bitmap 
     using (Bitmap bmp = new Bitmap(webBrowser1.ClientSize.Width, webBrowser1.ClientSize.Height)) { 
     using (Graphics gr = Graphics.FromImage(bmp)) { 
      IntPtr hdc = gr.GetHdc(); 
      render.DrawToDC(hdc); 
      gr.ReleaseHdc(); 
     } 
     bmp.Save("test.png"); 
     System.Diagnostics.Process.Start("test.png"); 
     } 
    } 

    // Replacement for mshtml imported interface, Tlbimp.exe generates wrong signatures 
    [ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")] 
    private interface IHTMLElementRender { 
     void DrawToDC(IntPtr hdc); 
     void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc); 
    } 
    } 
} 
+0

可这在非视觉environement被用于实例,在Windows服务器上的服务缩略HTML页面? – 2010-04-05 13:51:16

+0

我不明白为什么不,为了使其可用,您不必在表单上放置WebBrowser。 – 2010-04-05 13:53:00

+0

但是,WebBrowser需要一个STA线程和一个消息循环。你必须用Application.Run()创建一个。 – 2010-04-05 14:22:58