我需要捕獲生成的HTML圖像。我從這裏使用亞歷克斯菲利波維奇的優秀解決方案:Convert HTML string to image。除了當我試圖加載一個帶有使用一些Javascript加載的iframe的頁面時,它工作得很好。WebBrowser控件文檔完成iframe和Javascript完成後
static int width = 1024; static int height = 768; public static void Capture() { var html = @" <!DOCTYPE html> <meta http-equiv='X-UA-Compatible' content='IE=Edge'> <html> <iframe id='forecast_embed' type='text/html' frameborder='0' height='245' width='100%' src='http://forecast.io/embed/#lat=42.3583&lon=-71.0603&name=Downtown Boston'> </iframe> </html> "; StartBrowser(html); } private static void StartBrowser(string source) { var th = new Thread(() => { var webBrowser = new WebBrowser(); webBrowser.Width = width; webBrowser.Height = height; webBrowser.ScrollBarsEnabled = false; webBrowser.DocumentCompleted += webBrowser_DocumentCompleted; webBrowser.DocumentText = source; Application.Run(); }); th.SetApartmentState(ApartmentState.STA); th.Start(); } static void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var webBrowser = (WebBrowser)sender; using (Bitmap bitmap = new Bitmap(width, height)) { webBrowser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, width, height)); bitmap.Save(@"image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); } Application.Exit(); }
據我所知,有可能知道沒有明確的方式,如果所有的JavaScript的已經結束和iframe裝載的變幻莫測和事實,即有幀/ I幀+ 1。我可以處理DocumentCompleted得到的稱爲多次與iframe加載計數器或東西,但我想要的是一個合理的延遲,所以JavaScript加載,我沒有像這樣的「加載」的圖像:http://imgur.com/FiFMTmm
你會在我的代碼中添加一個計時器嗎?簡單的延遲對我來說就足夠了。 – naveed
@naveed,您可以將'webBrowser_DocumentCompleted'事件處理程序的簽名更改爲'async static void webBrowser_DocumentCompleted ...'。然後在'webBrowser_DocumentCompleted'內添加'await Task.Delay(1000)'作爲第一行。或者,如果沒有'async/await',請在'webBrowser_DocumentCompleted'內創建一個計時器,並將所有邏輯從'webBrowser_DocumentCompleted'移到計時器的事件處理程序中。有一件事要注意,無論如何,**'DocumentCompleted'可以被同一文檔多次觸發**(因爲框架)。使用靜態標誌變量來緩解這一點。 – Noseratio
太棒了!這工作!感謝Noseratio。 – naveed