Awesomium(一)-- WebSnapshot

原来WebSnapshot可以这么简单

http://www.khrona.com/products/awesomium/
http://awesomiumdotnet.codeplex.com/
http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/
http://khrona.com/wiki/index.php?title=Awesomium/

一、    WebSnapshot分析
WebSnapshot实现方法大致有两种思路:

第一种 —— 最最简单SB的方式就是屏幕截图,这种方式有三个很大的缺点:

1.    由于是截屏,所以无法在后台完成,而且霸占了屏幕。

2.    无法一次性截取那些内容较长的网页,可能还需要另外再做图片拼接工作,不可避免还要去处理拼接缝的问题。

3.    程序不能知道网页什么时候全部加载完毕,截屏时机把握不住。
等等…OUT!

第二种 —— 程序内嵌浏览器组件,通过浏览器的Render回调在后台来完成抓图。这种方式看来比较靠谱,但是难点在于用什么浏览器组件比较好。在经过尝试之后遇到了以下几种问题:

1.    由于需要后台抓图,所以过程中最好不要出现浏览器本身的界面。经过尝试嵌入IE浏览器没能解决,IE隐藏就没有回调…没办法,project改成窗体把IE放在角落用吧。

2.    虽然需要强行显示浏览器界面,但Render事件有了,不错。可惜Render事件只是针对HTML的Render,JS、Flash等外围组件是否加载完毕的事件不能获得。

3.    很多网页抓图效果就是白屏,例如map.baidu.com这种全JS或全Flash的网页就无法抓图。是浏览器没开放接口?还是需要额外处理才可以拿到JS或Flash的内容?
困难重重,此刻nono出现!推荐了Awesomium顿时豁然开朗。

二、    Awesomium简介

Awesomium是一个开源项目,其内核是基于google的Chrome,就是谷歌浏览器内核。有了它就可以将浏览器在Winform,WPF,Flash甚至3D游戏中嵌入,应用范围可以很广,它的功能已经不仅仅是一个浏览器而已,而是一个可以提供网页服务的类库,诸如网页抓图功能等,我们还可以通过WPF或者Flash将网页显示得更加绚丽,具有较高的灵活度,为我们开发人员带来了方便。

三、    实现步骤

1.    创建WebView

webView = webCore.CreateWebView(Width, Height, false);

2.    加载FinishLoading事件(这个事件包括了JS、Flash等浏览器组件的LoadingFinish)

webView.FinishLoading += OnFinishLoading;

3.    加载网页地址

webView.LoadUrl(URL);

4.    定时更新查询WebView状态以触发FinishLoading事件

webCore.Update();

5.    抓图

webView.RenderToBitmap(Width,Height,system.Drawing.Imaging.PixelFormat.Format24bppRgb);

posted @ 2012-10-09 22:28  CanMusic  阅读(3779)  评论(0编辑  收藏  举报