43

HTML マークアップを保持する文字列変数があります。この HTML マークアップは、基本的に電子メールの内容を表します。

ここで、実際に HTML マークアップを保持するこの文字列コンテンツから画像を作成したいと考えています。このコンテンツを HTML ファイルに書き込んで HTML ファイルを作成したくありません。この文字列を使用して画像ファイルを作成したいだけです。

ここに私が持っているものがあります:

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

emailBodyこの文字列コンテンツから画像を作成するにはどうすればよいですか?

4

4 に答える 4

30

次のことを試してください。

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

注: クレジットは、このソリューションに影響を与えた新しいスレッドでの質問 WebBrowser Control に関する優れた回答に対して、 Hans Passantに送られる必要があります。

于 2013-07-24T12:37:06.747 に答える
0

だから私はこれに出くわし、このようなものを探している人のために最新のソリューションを投稿すると考えました.

(オープンソース) Puppeteer Sharp (v3)を使用しました 。結果は次のようになります。

public class ImageRenderer : IDisposable
    {
        private BrowserFetcher _browserFetcher;

        public ImageRenderer()
        {
            _browserFetcher = new BrowserFetcher();
        }

        public async Task<byte[]> RenderImageDataAsync(string html)
        {
            try
            {
                // Download chrome (headless) browser (first time takes a while).
                await _browserFetcher.DownloadAsync();

                // Launch the browser and set the given html.
                await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
                await using var page = await browser.NewPageAsync();
                await page.SetContentAsync(html);

                // Select the element and take a screen-shot, or just use the page, for example: page.ScreenshotDataAsync()
                var elementQuery = "#myElementId";
                await page.WaitForSelectorAsync(elementQuery, new WaitForSelectorOptions { Timeout = 2000 }); // Wait for the selector to load.

                var elementHandle = await page.QuerySelectorAsync(elementQuery); // Declare a variable with an ElementHandle.
                var result = await elementHandle.ScreenshotDataAsync(
                    new ScreenshotOptions
                    {
                        Type = ScreenshotType.Png
                        // Quality = Not supported with PNG images!
                    }
                );

                await browser.CloseAsync();
                return result;
            }
            catch (Exception ex)
            {
                // Log ex $"{nameof(RenderImageDataAsync)}: Unable to render image from {nameof(html)}={html}");
            }

            return null;
        }

        public void Dispose()
        {
            _browserFetcher = null;
        }
    }
  • 長所: 本物のブラウザを使用します。
  • 短所: 本物のブラウザを使用します。このために約380MBのファイルを_browserFetcher.DownloadAsync();(フォルダに)ダウンロードします。.local-chromium
于 2021-10-13T11:02:20.197 に答える