WebBrowser.DrawToBitmap留下白色像素

时间:2012-08-14 19:12:11

标签: c# .net webbrowser-control gecko

我使用Gecko .NET WebBrowser控件来获取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最初没有它们),请参阅the link。< / p>

当我使用标准的.NET WebBrowser控件时,也发生了同样的事情,所以这不是Gecko问题。

我不知道如何处理这个问题。 有没有更好的方法将其保存到位图?或者这是最好的.NET可以做到的吗?

2 个答案:

答案 0 :(得分: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();
            }
        }

答案 1 :(得分: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 "";
    }

一个非常有趣的旁注:这适用于我的控件,这是我从未展示过的表格!我的表单作为无头Web浏览器存在,但这种实际形式从未见过光明。