0

HTML DIV コンテンツを介して画像を生成しようとしました。
以下のコードを使用して成功しましたSystem.Windows.Forms.WebBrowser

protected void Page_Load(object sender, EventArgs e)
{
string _GenerateString = @"VisualStudio<sup>ide test</sup>";
StringBuilder sb = new StringBuilder();           

sb.Append(" <style type=\"text/css\"> ");
sb.Append(" #_GenerateHTMLToImage_{ ");
sb.Append("     width:...px; ");
sb.Append("     height:...px; ");
sb.Append(" } ");
sb.Append(" </style> ");
sb.Append(" <div id='_GenerateHTMLToImage_'> ");
sb.Append(_GenerateString);
sb.Append(" </div> ");

//var bmp = MakeScreenshot_original(sb.ToString());
var bmp = MakeScreenshot(sb.ToString());
bmp.Save(@"C:\test_web.jpg");
}

public Bitmap MakeScreenshot(string html)
{
// Load the webpage into a WebBrowser control
WebBrowser wb = new WebBrowser();

wb.Navigate("about:blank");
if (wb.Document != null){
    wb.Document.Write(html);
}

wb.DocumentText = html;
wb.ScrollBarsEnabled = false;
wb.ScriptErrorsSuppressed = true;            
while (wb.ReadyState != WebBrowserReadyState.Complete) { 
    System.Windows.Forms.Application.DoEvents(); 
}

wb.Width = wb.Document.Body.ScrollRectangle.Width;
wb.Height = wb.Document.Body.ScrollRectangle.Height;

// Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control           
Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
wb.Dispose();

return bitmap;
} 

それは私を下の画像に生成します ここに画像の説明を入力

しかし、私の問題は、画像を生成することです(必要な文字列+不要な空白)。必要な画像のみの文字列を生成し、空白を削除する方法がわかりません。

以下の行からパラメーター値を変更しました...

Bitmap bitmap = new Bitmap(xxx, xxx);
wb.DrawToBitmap(bitmap, new Rectangle(xxx, xxx, xxxx, xxxx));

しかし、パラメーターの整数値を変更しても、結果は満足できません。

任意の提案をお願いします。

4

3 に答える 3

1

デフォルトのスタイルシートでは、ほとんどの DOM 要素にゼロ以外のマージンやパディングが与えられますbody

margin: 0; padding: 0;スタイルを明示的に設定することをお勧めしdivます。次に、divコンテナまでさらに下に移動し、代わりにその寸法を取得します。

于 2013-01-08T10:04:29.897 に答える
1

私の意見では、周囲の書き込みピクセルを削除することに勝った場合は、画像を作成した後にそれらを見つける単純なフィルターを使用してそれを行い、画像の最終的な開始点とサイズを見つけてカットします。

を使用してそれを行うことができますGetPixel(x, y)

たとえば、画像を上から下、次に下から上、同じ右から左、左から右にスキャンして、白いピクセルを含まない画像の新しいサイズを見つけることができます。

たとえば、次のようなものです。

for (int AxonX = 0; AxonX < wb.Width; AxonX++)
{
    for (int AxonY = 0; AxonY < wb.Height; AxonY++)
    {
        Color ThisPixelColor = wb.GetPixel(AxonX, AxonY);

        // Check if white or not and do the rest            
    }
}
于 2013-01-08T08:44:48.423 に答える
0

ついに私は自分の問題を解決する方法を見つけました。
同じ問題に直面する他の人が同じ困難を回避できるように、私がどのように解決するかを共有しましょう。

まず、@devstuffと@Aristosに感謝します。

私の解決策は以下のとおりです...

protected void Page_Load(object sender, EventArgs e)
    {   
        string _GenerateString = @"Number One 1<sup>st</sup> , the very first image creation.";
        StringBuilder sb_GenerateHTMLContent = new StringBuilder();
        sb_GenerateHTMLContent.Append(" <div style=\" white-space: nowrap \"> ");
        sb_GenerateHTMLContent.Append( _GenerateString );
        sb_GenerateHTMLContent.Append(" </div>");

        var bmp = MakeScreenshot(sb_GenerateHTMLContent.ToString());
        bmp.Save(@"C:\test_web.jpg");
    }

    public Bitmap MakeScreenshot(string html)
    {
        // Load the webpage into a WebBrowser control
        WebBrowser wb = new WebBrowser();
        Bitmap bitmap = null;
        try
        {
            wb.Navigate("about:blank");
            if (wb.Document != null)
            {
                wb.Document.Write(html);
            }

            wb.DocumentText = html;
            wb.ScrollBarsEnabled = false;
            wb.ScriptErrorsSuppressed = true;
            wb.Width = 0;

            while (wb.ReadyState != WebBrowserReadyState.Complete)
            {
                System.Windows.Forms.Application.DoEvents();
            }

            StringBuilder sb_style_body = new StringBuilder();
            sb_style_body.Append(" margin-top:0; ");
            sb_style_body.Append(" margin-right:0; ");
            sb_style_body.Append(" margin-left:0; ");
            sb_style_body.Append(" margin-bottom:0; ");                
            sb_style_body.Append(" padding-top:0; ");
            sb_style_body.Append(" padding-bottom:0; ");
            sb_style_body.Append(" padding-right:0; ");
            sb_style_body.Append(" padding-left:0; ");
            sb_style_body.Append(" font-family:Arial,Helvetica,sans-serif; ");
            sb_style_body.Append(" font-size:medium; ");

            wb.Document.Body.Style = sb_style_body.ToString();

            wb.Height = wb.Document.Body.ScrollRectangle.Height;
            wb.Width = wb.Document.Body.ScrollRectangle.Width;

            bitmap = new Bitmap(wb.Width, wb.Height);
            wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally {
            wb.Dispose();
        }
        return bitmap;
    }
于 2013-01-08T10:50:31.517 に答える