如何获取WatiN图像元素的位图?

我有一些文本字段处理和其他元素,但我想得到位图,所以我可以将它保存在磁盘上的某个地方。 如果可能的话,我需要直接从WatiN进行。

我怎样才能做到这一点?

我前段时间遇到过类似的问题。 Watin无法直接执行此操作,但它会公开获取某些结果所需的mshtml对象。

当时我的代码非常像这样:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using WatiN.Core; using WatiN.Core.Native.InternetExplorer; using mshtml; using System.Windows.Forms; namespace ConsoleApplication1 { class Program { [STAThread] static void Main(string[] args) { Browser browser = new IE("http://www.google.com"); IEElement banner = browser.Images[0].NativeElement as IEElement; IHTMLElement bannerHtmlElem = banner.AsHtmlElement; IEElement bodyNative = browser.Body.NativeElement as IEElement; mshtml.IHTMLElement2 bodyHtmlElem = (mshtml.IHTMLElement2)bodyNative.AsHtmlElement; mshtml.IHTMLControlRange controlRange = (mshtml.IHTMLControlRange)bodyHtmlElem.createControlRange(); controlRange.add((mshtml.IHTMLControlElement)bannerHtmlElem); controlRange.execCommand("Copy", false, System.Reflection.Missing.Value); controlRange.remove(0); if (Clipboard.GetDataObject() != null) { IDataObject data = Clipboard.GetDataObject(); if (data.GetDataPresent(DataFormats.Bitmap)) { System.Drawing.Image image = (System.Drawing.Image)data.GetData(DataFormats.Bitmap, true); // do something here } } } } } 

基本上,这个小小的黑客试图将图像复制到剪贴板。 但是我有一些问题使它正常工作,最终快照图像周围的区域并将其保存到磁盘。

虽然这可能不是很有帮助,但它可能会指向某些方向..

我认为你不能直接从WatiN获取二进制信息。 但是,您有Image.Uri方法为您提供图像的URI。 因此,很容易下载它与http请求。

 using (Browser browser = new IE("http://www.sp4ce.net/computer/2011/01/06/how-to-use-WatiN-with-NUnit.en.html")) { Image image = browser.Images[0]; Console.Write(image.Uri); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(image.Uri); WebResponse response = request.GetResponse(); using (Stream stream = response.GetResponseStream()) using (FileStream fs = File.OpenWrite(@"c:\foo.png")) { byte[] bytes = new byte[1024]; int count; while((count = stream.Read(bytes, 0, bytes.Length))!=0) { fs.Write(bytes, 0, count); } } } 

希望这可以帮助

前一段时间我也需要提取图像数据,所以我提出了这个解决方案:

使用在页面内创建隐藏字段和canvas

 ie.RunScript("document.body.innerHTML += \"\";"); ie.RunScript("document.body.innerHTML += \"\";"); 

使用javascript将其转换为base64并检索其值

 ie.RunScript("var c = document.getElementById('canv');"); ie.RunScript("var ctx = c.getContext('2d');"); ie.RunScript("var img = document.getElementsByName('imgCaptcha')[0];"); ie.RunScript("ctx.drawImage(img, 10, 10);"); ie.RunScript("document.getElementById('hidden64').value=c.toDataURL();"); 

然后检索编码值

 string data = ie.Element(Find.ById("hidden64")).GetAttributeValue("value"); var base64Data = Regex.Match(data, @"data:image/(?.+?),(?.+)").Groups["data"].Value; var binData = Convert.FromBase64String(base64Data); Bitmap im; using (var stream = new MemoryStream(binData)) { im = new Bitmap(stream); } 

希望能帮助到你 :)

 public Image GetImageFromElement(IHTMLElement Element) { int width = (int)Element.style.width; int height = (int)Element.style.height; IHTMLElementRender2 render = (IHTMLElementRender2)Element; Bitmap screenCapture = new Bitmap(width, height); Rectangle drawRectangle = new Rectangle(0, 0, width, height); this.DrawToBitmap(screenCapture, drawRectangle); Graphics graphics = Graphics.FromImage(screenCapture); IntPtr graphicshdc = graphics.GetHdc(); render.DrawToDC(graphicshdc); graphics.ReleaseHdc(graphicshdc); graphics.Dispose(); return screenCapture as Image; } 

那是我用于php生成的图像的方法。 它在我自己的WebBrowserClass中得到了启发,它扩展了webbrowser控件。

(所以“this”= WebBrowser)

但我们必须导入IHTMLElementRender2接口才能使用该方法。

 [Guid("3050f669-98b5-11cf-bb82-00aa00bdce0b"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(true), ComImport] interface IHTMLElementRender2 { void DrawToDC([In] IntPtr hDC); void SetDocumentPrinter([In, MarshalAs(UnmanagedType.BStr)] string bstrPrinterName, [In] IntPtr hDC); }; 

我在大约1年前在网上找到了这种方法,所以如果你搜索它,你可能会找到更多的信息。

我要

我有这样的问题,我无法解决它。 PHP始终生成新图像,因此我使用了CaptureWebPageToFile()方法。