2010-04-05 38 views
8

Mam ciąg z adresem URL. Na przykład "http://google.com".Renderowanie strony internetowej do obrazu

Czy istnieje sposób na pobranie i wyrenderowanie tej strony do pliku obrazu? ("test.jpg")

Próbowałem użyć formantu WebBrowser, aby pobrać i wyrenderować obrazek, ale działa on tylko wtedy, gdy WebBrowser umieszczony jest w wyświetlanym formularzu. W inny sposób renderuje tylko czarny prostokąt.

Ale chcę, aby uczynić obraz bez efektu wizualnego (tworzenie, aktywując formularz etc.)

Odpowiedz

9

Internet Explorer obsługuje interfejs IHtmlElementRenderer, dostępny do renderowania strony do dowolnego kontekstu urządzenia. Oto przykładowy formularz, który pokazuje, jak z niego korzystać. Start z Projektu + Add Reference wybrać 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

Może to być wykorzystane w nie environement wizualnej dla instancja, w usłudze na serwerze Windows do miniatur stron HTML? –

+0

Nie widzę powodu, dlaczego nie, nie musisz umieszczać WebBrowser na formularzu, aby był użyteczny. –

+0

Jednak WebBrowser wymaga wątku STA i pętli komunikatów. Musisz utworzyć go za pomocą Application.Run(). –

Powiązane problemy