使用WebBrowser.DrawToBitmap捕获.net网页包含所有白色或部分加载的页面

时间:2016-03-12 21:22:28

标签: c# facebook webbrowser-control

我使用了here

看起来非常简单易用的代码
protected void Capture(object sender, EventArgs e)

{

string url = txtUrl.Text.Trim();

Thread thread = new Thread(delegate()

{

    using (WebBrowser browser = new WebBrowser())

    {

        browser.ScrollBarsEnabled = false;

        browser.AllowNavigation = true;

        browser.Navigate(url);

        browser.Width = 1024;

        browser.Height = 768;

        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);

        while (browser.ReadyState != WebBrowserReadyState.Complete)

        {

            System.Windows.Forms.Application.DoEvents();

        }

    }

});

thread.SetApartmentState(ApartmentState.STA);

thread.Start();

thread.Join();
}



private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

{

WebBrowser browser = sender as WebBrowser;

using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height))

{

    browser.DrawToBitmap(bitmap, new Rectangle(0, 0, browser.Width, browser.Height));

    using (MemoryStream stream = new MemoryStream())

    {

        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);

        byte[] bytes = stream.ToArray();

        imgScreenShot.Visible = true;

        imgScreenShot.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(bytes);

    }

}

}

但是,当我在Facebook网址或某些其他网站上运行时,我会得到一张全白的结果图片。有时我会得到初始页面的部分,所以看起来像是对所有新网络技术的时间问题。

WebBrowser可能正在指示ReadyState of Complete,即使页面上的元素仍在继续加载。

如果我添加一些Thread.Sleeps,它似乎没有帮助。

1 个答案:

答案 0 :(得分:0)

这是因为DocumentCompleted不仅会发射一次,在你的情况下还为时过早。 看看这个:Why is WebBrowser_DocumentCompleted() firing twice?