2012-08-14 89 views
2

我使用Gecko .NET WebBrowser控件來獲取HTML頁面。WebBrowser.DrawToBitmap留下白色像素

然後我用這個代碼,使這個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可以做的?

回答

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(); 
      } 
     } 
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 ""; 
    } 

一個非常有意思的是:這適用於我的控制,是我從來沒有表現出一個形式!我的表單作爲無頭網頁瀏覽器存在,但這種實際形式從來沒有見過光明的一天。