原来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);