Awesomium(二)-- MultiThreadSnapshot
一、 介紹
延續上一篇針對Awesomium的試用感受,感覺還是挺不錯的,覺得網頁抓圖功能效果很好,今后具有一定重用性,因此特地進行了封裝,讓它支持多線程并發截圖。
?????? 以Helper的形式進行了封裝,封裝類是WebSnapshot,由于內部的WebCore對象是一個重對象,因此將其做成了單件形式。下面是封裝暴露的接口:
delegate void FinishSnapshot(Bitmap bmp)void BeginSave(string url, string savePath, FinishSnapshot finishCallback)Bitmap Save(string url, string savePath)看看接口名,顧名思義分為同步和異步兩種抓圖方法。
參數說明:url是需要抓圖的網站地址;savePath是抓圖后保存的文件路徑(當設置為null時則不進行保存);finishCallback是異步抓圖完成后的回調;如果需要對圖片進行后期調整及后期保存,可以使用同步方法中的返回值或者異步方法中的回調,然后將savePath設置為null,即可。
二、 使用方法說明
1. 編譯時依賴的類庫為AwesomiumDotNet.dll(Version 1.2.1);運行時依賴的類庫為Awesomium.dll(Version 1.5.1)和icudt38.dll(使用VS的BuildEvents功能將Runtime類庫復制到程序當前目錄下)
2. 調用例子:
自動保存圖片
WebSnapshot.Instance.BeginSave("http://www.sina.com.cn", @"c:\sina.bmp", (bmp) => { Console.WriteLine("sina finish!"); });手動保存圖片
WebSnapshot.Instance.BeginSave("http://www.microsoft.com", null, (bmp) => {Console.WriteLine("ms finish!");bmp.Save(@"c:\ms.bmp"); });三、 類庫封裝細節說明
1. WebCore.Update()
由于WebCore為重量級對象,WebView則相對輕量級,而且是在多線程環境下執行,因此選擇使用單件模式避免WebCore反復被構造。WebView是從WebCore創建的,Update()方法用來更新所有WebView加載頁面的當前狀態,用來觸發WebView的事件。防止多線程資源訪問沖突,Update()方法需要lock。
2. WebView.Resize()
原理就是將WebView的尺寸調整為和頁面同樣大小,這樣截圖就能更完整,不管多長的頁面都可以在一張圖片中完整的保存。這里還使用到了WebView.ExecuteJavaScriptWithResult()方法,通過javascript獲得當前頁面的實際長寬,然后再調整WebView的Size,最后RenderToBitmap()。
3. WebCoreOptions
在構造WebCore的時候需要傳遞WebCoreOptions,顧名思義就是設置WebCore參數。其中比較實用的就是LogLevel和LogPath兩個屬性,用來控制瀏覽器內核的日志輸出。
public enum LogLevel {None = 0, // No log is createdNormal = 1, // Logs only errorsVerbose = 2, // Logs everything }四、代碼
Snapshot.7z
轉載于:https://www.cnblogs.com/canmusic/archive/2012/10/09/2717465.html
總結
以上是生活随笔為你收集整理的Awesomium(二)-- MultiThreadSnapshot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode - Linked Li
- 下一篇: QueryDSL