2013-07-24 188 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(); –