2

Gecko.NETWebBrowserコントロールを使用してHTMLページを取得します。

次に、このコードを使用して、このHTMLページのスクリーンショットを作成します。

void LoadingFinished(object sender, EventArgs args)
{
    try
    {
        myBrowser.Document.Body.SetAttribute("style", "overflow:hidden");
        if (screenshotkey != "")
        {
            Bitmap bitmap = new Bitmap(myBrowser.Width, myBrowser.Height);
            myBrowser.DrawToBitmap(bitmap, new Rectangle(0, 0, myBrowser.Width, myBrowser.Height));
            bitmap.Save("Screenshots/" + screenshotkey + ".png", ImageFormat.Png);
        }
    }
    catch (Exception dfkvsn)
    {
        errorloadingpage();
    }
}

上記のコードから、ブラウザの幅の設定など、それほど重要ではないものをいくつか削除しました。元々、コードは100%機能しています。

問題は、pngスクリーンショット(DrawToBitmapライン)を保存するときに、作成された画像にあるべきではない白いピクセルが含まれていることです(WebBrowserには元々ありません) 。リンクを参照してください

標準の.NETWebBrowserコントロールを使用していたときにも同じことが起こっていたので、Geckoの問題ではありません。

私はこれにどのようにアプローチするのか分かりません。それをビットマップに保存するためのより良い方法はありますか?それとも、これは.NETでできる最高のことですか?

4

2 に答える 2

3

修正しました。
白く見えるピクセルは、ただ透明であることがわかりました。
そして、それらは画像が最も深い黒色 (RGB 0, 0, 0) を持つ場所にのみありました。
何らかの理由で、.NET はこの色をファイルに保存できませんでした。
そこで、画像全体を黒くするコード行を追加しただけで、その上にスクリーンショットを記録しました。
現在2つのレイヤーであるため、透明なピクセルが黒く見えるようになりました-まさに私が望んでいたものです-白いピクセルはありません。
最終的なコードは次のとおりです。

void LoadingFinished(object sender, EventArgs args)
        {
            try
            {
                myBrowser.Document.Body.SetAttribute("style", "overflow:hidden");
                if (screenshotkey != "")
                {
                    panel1.Height = myBrowser.Document.Body.ScrollHeight;
                    panel1.Width = myBrowser.Document.Body.ScrollWidth;
                    this.Size = new System.Drawing.Size(panel1.Width+20, panel1.Height+20);

                    if (!Directory.Exists("Screenshots"))
                    {
                        Directory.CreateDirectory("Screenshots");
                    }

                    Bitmap bitmap = new Bitmap(myBrowser.Width, myBrowser.Height);
                    for (int Xcount = 0; Xcount < bitmap.Width; Xcount++)
                    {
                        for (int Ycount = 0; Ycount < bitmap.Height; Ycount++)
                        {

                            bitmap.SetPixel(Xcount, Ycount, Color.Black);
                        }
                    }
                    myBrowser.DrawToBitmap(bitmap, new Rectangle(0, 0, myBrowser.Width, myBrowser.Height));
                    bitmap.Save("Screenshots/" + screenshotkey + ".png", ImageFormat.Png);
                }
            }
            catch (Exception dfkvsn)
            {
                errorloadingpage();
            }
        }
于 2012-09-03T11:08:21.497 に答える
2

これはまさに私に起こっていたことです。私も今は直っていると思います。最初の画像(コントロールを作成する前)に何かが必要だとは思ってもみませんでした。最初の画像をすべて黒にクリアするために添付した簡略化されたコードに注意してください。

    try
    {
        string fn = Path.Combine(Path.GetTempPath(), "Error_screen.png");
        Bitmap bmp = new Bitmap(internalBrowser.Width, internalBrowser.Height);

        // In order to use DrawToBitmap, the image must have an INITIAL image. 
        // Not sure why. Perhaps it uses this initial image as a mask??? Dunno.
        using (Graphics G = Graphics.FromImage(bmp))
        {
            G.Clear(Color.Black);
        }

        internalBrowser.DrawToBitmap(bmp, new Rectangle(0, 0, 
                    internalBrowser.Width, internalBrowser.Height));

        bmp.Save(fn, ImageFormat.Png);
    }
    catch
    {
        // handle exceptions here.

        return "";
    }

非常に興味深い補足事項の1つ:これは、これまでに示したことのない形式のコントロールで機能します。私のフォームはヘッドレスWebブラウザーとして存在しますが、この実際のフォームは日の目を見ることはありません。

于 2013-03-18T20:03:10.150 に答える