WebBrowser.DrawToBitmap留下白色像素(WebBrowser.DrawToBit

2019-09-21 05:20发布

我使用的是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线) -在一些地方被创建图片有白色像素,不应该在那里(web浏览器最初没有它们),请参阅该链接 。

当我使用标准的.NET WebBrowser控件同样的事情正在发生,所以它不是壁虎问题。

我不知道如何处理这个。 有没有更好的方式来保存为位图? 或者,这是最好的.NET可以做什么?

Answer 1:

修复。
原来,这似乎是白色像素 - 只是透明。
他们只在照片有一个最深的黑色的地方(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();
            }
        }


Answer 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浏览器,但这实际形式从未见过天日。



文章来源: WebBrowser.DrawToBitmap leaves white pixels