TEK
TEK

Reputation: 1265

Obtain full-page screenshot from WebBrower component

I am attempting to capture a full-page screenshot of any website a user is viewing using the WebBrowser component.

At present, I am able to only able to capture what a user is viewing from within the WebBrowser. However, the screenshot image created is the size of the webpage. For example, below is a (half-sized) screenshot of the BBC website, the black area is actually saved transparent but I've filled it black for visibility.

Failed screenshot of the BBC website

I have seen solutions where a new WebBrowser instance is used to fetch a fullpage snapshot. However, I need the screenshot to be exactly of the page as the user is viewing it at the time, much like how the full-page screenshot works in Firefox.

My code below that generated the above image:

private void button1_Click(object sender, EventArgs e)
{

        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }

        int scrollWidth = 0;
        int scrollHeight = 0;

        scrollHeight = webBrowser1.Document.Body.ScrollRectangle.Height;
        scrollWidth = webBrowser1.Document.Body.ScrollRectangle.Width;
        webBrowser1.Size = new Size(scrollWidth, scrollHeight);
        Bitmap bm = new Bitmap(scrollWidth, scrollHeight);

        webBrowser1.DrawToBitmap(bm, new Rectangle(0, 0, bm.Width, bm.Height));
        bm.Save(@"D:\Screenshots\test.png", ImageFormat.Png);


  }

Upvotes: 4

Views: 2543

Answers (1)

Abdul Saleem
Abdul Saleem

Reputation: 10622

I've got a good working one..

 private void button1_Click(object sender, EventArgs e)
    {
       using (FileDialog fd = new SaveFileDialog())
        {
            fd.Filter = "Image (*.png)|*.png";
            if (fd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                new WebPageSnap(webBrowser1.Url.ToString(), fd.FileName);
                //might take 3 or 4 seconds to save cauz it has to load again.
            }
        }
    }

    class WebPageSnap
    {
        WebBrowser wb;
        string outFile;

        public WebPageSnap(string url, string outputFile)
        {
            wb = new WebBrowser();
            wb.ProgressChanged += wb_ProgressChanged;
            outFile = outputFile;
            wb.ScriptErrorsSuppressed = true;
            wb.ScrollBarsEnabled = false;
            wb.Navigate(url);
        }

        void wb_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
        {
            if (e.CurrentProgress == e.MaximumProgress)
            {
                wb.ProgressChanged -= wb_ProgressChanged;
                try
                {
                    int scrollWidth = 0;
                    int scrollHeight = 0;

                    scrollHeight = wb.Document.Body.ScrollRectangle.Height;
                    scrollWidth = wb.Document.Body.ScrollRectangle.Width;
                    wb.Size = new Size(scrollWidth, scrollHeight);


                    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
                    for (int Xcount = 0; Xcount < bitmap.Width; Xcount++)
                        for (int Ycount = 0; Ycount < bitmap.Height; Ycount++)
                            bitmap.SetPixel(Xcount, Ycount, Color.Black);
                    wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
                    bitmap.Save(outFile, ImageFormat.Png);
                }
                catch { }
            }
        }

    }

.

;Here's the result

.

enter image description here

Upvotes: 2

Related Questions