2

我使用 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 最初没有它们),请参阅链接

当我使用标准的 .NET WebBrowser 控件时也发生了同样的事情,所以这不是 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 "";
    }

一个非常有趣的旁注:这适用于我的控件,它位于我从未展示过的表单上!我的表单作为无头网络浏览器存在,但这种实际表单从未出现过。

于 2013-03-18T20:03:10.150 回答