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
}

四、代码

Snapshot.7z

posted @ 2012-10-09 22:32  CanMusic  阅读(1493)  评论(1编辑  收藏  举报