2013-07-24 18 views
26

Mam zmienną łańcuchową, która zawiera znaczniki HTML. Ten znacznik HTML w zasadzie reprezentuje treść wiadomości e-mail.Konwertuj ciąg znaków HTML na obrazki

Teraz chcę utworzyć obraz z tej treści ciągu, która faktycznie zawiera znaczniki HTML. Nie chcę tworzyć pliku HTML, pisząc do nich tę zawartość. Chcę tylko utworzyć plik obrazu za pomocą tego ciągu.

Oto co mam:

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

Jak mogę utworzyć obraz z tego emailBody zawartości strun?

+1

Duplikat: http://stackoverflow.com/questions/10721884/render-html-to-an-image –

+1

Czy trzeba coś takiego [http: // htmlrenderer.codeplex.com/](http://htmlrenderer.codeplex.com/)? –

+0

Dzięki @AlexFilipovici. Zajrzałem do tego i znalazłem również post na ten temat. Ale chcę tylko wiedzieć, czy istnieje jakiś kod natywny jest dostępny dla tego .. W jaki sposób będę go używać, jeśli nic innego nie zostanie znaleziony. http://amoghnatu.wordpress.com/2013/05/13/converting-html-text-to-image-using-c/ – Sachin

Odpowiedz

43

Dziękuję wszystkim za odpowiedzi. Użyłem zewnętrznej biblioteki DLL, aby osiągnąć to samo i znalazłem code dla tego samego.

Oto kod dla tego

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

Dlaczego ta odpowiedź nie daje więcej szans na awans? Pracował prawie idealnie dla mnie (z wyjątkiem tego, że musiałem trochę precyzyjniej dostroić rozdzielczość obrazu)? – Marcel

+0

Zamiast tego użyj HtmlRenderer.HtmlRender.RenderGdiPlus lub nie wygląda zbyt dobrze. –

+0

Zobacz HTML Renderer [Generowanie obrazu ze znaczników HTML] (https://htmlrenderer.codeplex.com/wikipage?title=Image%20generation) dla wszystkich szczegółów. – Arthur

1

Nie trzeba konwertować html na obraz, aby wysłać jako treść wiadomości e-mail.

Wystarczy ustawić zawartość na łańcuch, który posiadasz, i typ zawartości tej części ciała odpowiednio.

+0

Dzięki za odpowiedź. Ale nie chcę wysyłać obrazu do poczty. Chcę zapisać tę treść wiadomości jako obraz do innego użytku. – Sachin

20

Spróbuj wykonać następujące czynności:

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); 
     } 
    } 
} 

Uwaga: Kredyty powinien udać się do Hans Passant za doskonałą answer na pytanie WebBrowser Control in a new thread który zainspirował to rozwiązanie.

+0

Poniższy wiersz zawiera błąd Application.Run(); –