2013-07-24 244 views
26

我有一個包含HTML標記的字符串變量。這個HTML標記基本上代表了電子郵件的內容。將HTML字符串轉換爲圖像

現在我想從這個字符串內容創建一個圖像,它實際上保存了HTML標記。 我不想通過將這些內容寫入它們來創建HTML文件。我只是想用這個字符串創建一個圖像文件。

這是我有:

string emailBody="<html><head></head><body><p>This is my text<p>...</body</html>" 

如何創建從這個emailBody字符串內容的圖像?

+1

複製代碼:http://stackoverflow.com/questions/10721884/render-html-to-an-image –

+1

你需要像[HTTP:// htmlrenderer.codeplex.com/](http://htmlrenderer.codeplex.com/)? –

+0

謝謝@AlexFilipovici。我已經看過這個,我也發現了這個帖子。但我只想知道是否有任何本機代碼可用於此。任何方式我會使用它,如果沒有其他東西被發現。 http://amoghnatu.wordpress.com/2013/05/13/converting-html-text-to-image-using-c/ – Sachin

回答

43

謝謝大家的回覆。我已經使用HtmlRenderer外部的dll實現相同,並發現相同的code

下面是該

public void ConvertHtmlToImage() 
{ 
    Bitmap m_Bitmap = new Bitmap(400, 600); 
    PointF point = new PointF(0, 0); 
    SizeF maxSize = new System.Drawing.SizeF(500, 500); 
    HtmlRenderer.HtmlRender.Render(Graphics.FromImage(m_Bitmap), 
              "<html><body><p>This is a shitty html code</p>" 
              + "<p>This is another html line</p></body>", 
              point, maxSize); 

    m_Bitmap.Save(@"C:\Test.png", ImageFormat.Png); 
} 
+1

爲什麼這個答案沒有得到更多upvotes?對我來說幾乎完美的工作(除了我必須做一些圖像分辨率的微調)? – Marcel

+0

改爲使用HtmlRenderer.HtmlRender.RenderGdiPlus,否則它看起來不太好。 –

+0

查看HTML渲染器[從HTML標記生成圖像](https://htmlrenderer.codeplex.com/wikipage?title=Image%20generation)瞭解所有細節。 – Arthur

1

有沒有必要將HTML轉換爲圖像發送作爲電子郵件的正文。

只需將內容設置爲您所擁有的字符串以及相應正文部分的內容類型即可。

+0

感謝您的回覆。但我不想將圖像發送到郵件中。我想將該郵件正文另存爲Image以用於其他用途。 – Sachin

20

嘗試以下操作:

using System; 
using System.Drawing; 
using System.Threading; 
using System.Windows.Forms; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var source = @" 
     <!DOCTYPE html> 
     <html> 
      <body> 
       <p>An image from W3Schools:</p> 
       <img 
        src=""http://www.w3schools.com/images/w3schools_green.jpg"" 
        alt=""W3Schools.com"" 
        width=""104"" 
        height=""142""> 
      </body> 
     </html>"; 
     StartBrowser(source); 
     Console.ReadLine(); 
    } 

    private static void StartBrowser(string source) 
    { 
     var th = new Thread(() => 
     { 
      var webBrowser = new WebBrowser(); 
      webBrowser.ScrollBarsEnabled = false; 
      webBrowser.DocumentCompleted += 
       webBrowser_DocumentCompleted; 
      webBrowser.DocumentText = source; 
      Application.Run(); 
     }); 
     th.SetApartmentState(ApartmentState.STA); 
     th.Start(); 
    } 

    static void 
     webBrowser_DocumentCompleted(
     object sender, 
     WebBrowserDocumentCompletedEventArgs e) 
    { 
     var webBrowser = (WebBrowser)sender; 
     using (Bitmap bitmap = 
      new Bitmap(
       webBrowser.Width, 
       webBrowser.Height)) 
     { 
      webBrowser 
       .DrawToBitmap(
       bitmap, 
       new System.Drawing 
        .Rectangle(0, 0, bitmap.Width, bitmap.Height)); 
      bitmap.Save(@"filename.jpg", 
       System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 
    } 
} 

注:學分應該去Hans Passant爲他的啓發這個解決方案的問題WebBrowser Control in a new thread優秀answer

+0

以下行提供了錯誤Application.Run(); –