c#使用GeckoFx浏览器核心复制网页里某张图片

前言:

最近有个项目网页截取项目,需要从浏览器里网页里的某张图片显示到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 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);

,真好刚刚合我的胃口,直接可以获取到图片的比特流,接下来就好办了

 		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#使用GeckoFx浏览器核心复制网页里某张图片)