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