【问题标题】:WebBrowser.DrawToBitmap leaves white pixelsWebBrowser.DrawToBitmap 留下白色像素
【发布时间】:2012-08-14 19:12:10
【问题描述】:

我使用 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

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

我不知道如何解决这个问题。 有没有更好的方法将它保存到位图?还是这是 .NET 可以做到的最好的?

【问题讨论】:

    标签: c# .net webbrowser-control gecko


    【解决方案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();
                }
            }
    

    【讨论】:

      【解决方案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 "";
          }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        • 2011-07-18
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 2015-05-05
        相关资源
        最近更新 更多