c#使用GeckoFx浏览器核心复制网页里某张图片
2015-02-16 01:08
281 查看
前言:
最近有个项目网页截取项目,需要从浏览器里网页里的某张图片显示到picturebox里。原先打算使用自带的webbrowser,不过问题马上来了,使用ie核心那个网页上的js代码运行有错误,很是影响获取,无奈只能放弃webbrowser,考虑使用其他浏览器核心,现在.NET下可以使用Webkit内核与Gecko内核,这两个内核都是开源的,各自的代表为Xilium.CefGlue与GeckoFX,前者参考资料太少,只能看源代码一步一步摸索其机制,而且有某些浏览器响应事件有大坑,弄了一天无果只能考虑转向GeckoFX。它的资料倒是挺多的,不过他的使用环境配置需要留意,因为其需要使用到火狐开源的xulrunner,若geckofx-core与xulrunner版本对不上,调试模式下运行看不到Gecko控件窗口,直接运行exe报错,百度了大半天无果,谷歌也一样。。。。后台只能根据exe运行报错的位置翻看Gecko核心的代码,结果发现xulrunner版本对不上。所以去到gecko官网下载对应的,原来官网已经有说明geckofx-core与xulrunner版本对应的关系,真悲哀,当初没有去官网溜达。
回归正题,既然要获取网页里的图片,要么找到图片的地址下载下来再加载,这种个人觉得较麻烦,虽然容易实现。另一种是复制图片,将其弄到剪切板或者得到图片的byte数组再构建。在webbrowser下,我之前项目使用的是将图片复制到剪切板再从剪切板获取。
现在改用Gecko核心,由于对其不熟悉,所有仿造了上面的思路,结合在对象浏览器里查找其函数自己写了一段,第一二句就是获取img图片的对象,在Gecko里很简单
,真好刚刚合我的胃口,直接可以获取到图片的比特流,接下来就好办了
完美解决问题
最近有个项目网页截取项目,需要从浏览器里网页里的某张图片显示到picturebox里。原先打算使用自带的webbrowser,不过问题马上来了,使用ie核心那个网页上的js代码运行有错误,很是影响获取,无奈只能放弃webbrowser,考虑使用其他浏览器核心,现在.NET下可以使用Webkit内核与Gecko内核,这两个内核都是开源的,各自的代表为Xilium.CefGlue与GeckoFX,前者参考资料太少,只能看源代码一步一步摸索其机制,而且有某些浏览器响应事件有大坑,弄了一天无果只能考虑转向GeckoFX。它的资料倒是挺多的,不过他的使用环境配置需要留意,因为其需要使用到火狐开源的xulrunner,若geckofx-core与xulrunner版本对不上,调试模式下运行看不到Gecko控件窗口,直接运行exe报错,百度了大半天无果,谷歌也一样。。。。后台只能根据exe运行报错的位置翻看Gecko核心的代码,结果发现xulrunner版本对不上。所以去到gecko官网下载对应的,原来官网已经有说明geckofx-core与xulrunner版本对应的关系,真悲哀,当初没有去官网溜达。
回归正题,既然要获取网页里的图片,要么找到图片的地址下载下来再加载,这种个人觉得较麻烦,虽然容易实现。另一种是复制图片,将其弄到剪切板或者得到图片的byte数组再构建。在webbrowser下,我之前项目使用的是将图片复制到剪切板再从剪切板获取。
HTMLDocument html = (HTMLDocument)this.webBrowser_Inter.Document.DomDocument; IHTMLControlElement img = (IHTMLControlElement)webBrowser_Inter.Document.Images[0].DomElement; IHTMLControlRange range = (IHTMLControlRange)((HTMLBody)html.body).createControlRange(); range.add(img); range.execCommand("Copy", false, null); pictureBox1.Image = Clipboard.GetImage();
现在改用Gecko核心,由于对其不熟悉,所有仿造了上面的思路,结合在对象浏览器里查找其函数自己写了一段,第一二句就是获取img图片的对象,在Gecko里很简单
IGeckoArray<GeckoHtmlElement> img = browser.Document.GetElementsByTagName("img"); GeckoImageElement ima= (GeckoImageElement)img[0];接下来那些找不到类似的函数,无奈只能转变方式。直接在对象浏览器里输入image关键字,看看他本身有提供什么函数。还真有
public static byte[] ConvertGeckoImageElementToPng(IGeckoWebBrowser browser, GeckoHtmlElement element, float xOffset, float yOffset, float width, float height);
,真好刚刚合我的胃口,直接可以获取到图片的比特流,接下来就好办了
<span style="white-space:pre"> </span>byte[] stream= Gecko.Utils.SaveImageElement.ConvertGeckoImageElementToPng(browser, ima, 0, 0, ima.Width, ima.Height); MemoryStream s = new MemoryStream(); s.Write(stream, 0, stream.Length); pictureBox1.Image = Image.FromStream(s);
完美解决问题
相关文章推荐
- C#怎么使用默认浏览器打开网页
- 网络采集软件核心技术剖析系列(4)---使用C#语言如何将html网页转换成pdf(html2pdf)
- 生成黑白画笔,android使用系统浏览器打开网页,将Bitmap图片存储在本地JPG文件的方法
- C# 使用默认浏览器打开网页
- 简单的IE内核多页浏览器(支持解锁右键锁定和文字选择复制锁定支持网页截成图片)
- C#使用默认浏览器打开网页的方法
- C#使用默认浏览器打开指定网页
- 网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览
- 微信浏览器返回刷新,监听微信浏览器返回事件,网页防复制,移动端禁止图片长按和vivo手机点击img标签放大图片
- C# 调用IE打开网页链接 or 直接使用默认浏览器打开网页链接
- C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序
- C# winform中使用默认浏览器打开网页
- C#使用默认浏览器打开网页
- C# 使用默认浏览器带网页
- 使用C#在进度条中显示复制文件的进度
- 使用C#和Excel进行报表开发(四)-复制单元格
- 使用C#和Excel进行报表开发(四)-复制单元格
- 使用C#在进度条中显示复制文件的进度
- 使用 SqlBulkCopy 大量复制文字文件之 C# 程序代码
- 使用C#和Excel进行报表开发(四)-复制单元格