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 created Normal = 1, // Logs only errors Verbose = 2, // Logs everything }
四、代码