回答
我不認爲你可以直接從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);
}
}
}
希望這有助於
我前一段時間也有類似的問題。 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
}
}
}
}
}
這個小黑客,基本上,試圖將圖像複製到剪貼板。不過,我遇到了一些問題,使其正常工作,並最終在圖像周圍快照區域並將其保存到磁盤。
雖然這可能不是非常有幫助的,可能你指出一些方向..
Thx,我會嘗試它,當我從假期回來,也許發佈我的結果。 – 2011-01-13 11:18:00
我有這樣的問題,我解決不了它。 PHP一直都會生成新的圖像,所以我使用了CaptureWebPageToFile()
方法。
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控件。
(所以「這個」 = web瀏覽器)
但是,我們必須導入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);
};
,我發現在網絡這個方法,大約一年前,如果你搜索它你可能會發現更多的信息。
伊萬
前一段時間,我需要提取的圖像數據量太大,所以我想出了這個解決方案:
創建一個隱藏字段和帆布使用
ie.RunScript("document.body.innerHTML += \"<input type='hidden' id='hidden64'/>\";");
ie.RunScript("document.body.innerHTML += \"<canvas id='canv' width='150px' height='40px' ></canvas>\";");
改造它的頁面內到base64使用JavaScript並檢索其值
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/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data);
Bitmap im;
using (var stream = new MemoryStream(binData))
{
im = new Bitmap(stream);
}
希望它能幫助:)
- 1. 如何獲得Watin元素列表?
- 2. 如何獲得圖像中的圖像?
- 3. 如何獲得圖像以元素頂部爲中心的50%
- 4. 如何獲得畫布中圖像元素的座標
- 5. 如何獲得iOS中UI元素的標準背景圖像?
- 6. Android位圖獲取像素
- 7. 如何從GLSurfaceView得到位圖圖像
- 8. 如何獲得地圖/圖像地圖
- 9. 如何獲得圖像的觸摸部分位圖?
- 10. Android:如何獲得單個通道的像素16位PNG位圖
- 11. 如何獲得像素位置
- 12. 如何將數組元素(圖像)轉換爲位圖?
- 13. 如何從這個大div元素獲取圖像元素?
- 14. 如何獲得圖像的像素在win8的應用
- 15. 獲得像素值灰度圖像16位.net
- 16. 如何獲得ios中的圖像像素
- 17. 如何獲得黑白圖像的像素值?
- 18. 如何獲得墊圖像的像素區域
- 19. 如何從gridView獲取圖像(位圖)
- 20. 如何獲得我用UrlFetchApp.fetch(photoLink)獲得的jpeg圖像的大小(以像素爲單位)?
- 21. 獲得位置+ 20像素?
- 22. 如何定位圖片中的元素?
- 23. 試圖獲得像素的顏色值
- 24. 如何旋轉位圖的像素
- 25. 如何操作位圖中的像素?
- 26. 如何刪除位圖中的像素?
- 27. 如何訪問Android上的位圖圖像的像素?
- 28. 如何呈現從有位圖效果WPF元素的位圖?
- 29. 如何獲得哪個圖像(其位置)在圖像庫中的焦點?
- 30. 定位div元素相對於圖像
是的,我可以用這一點,但每個請求的形象正在改變... PHP代碼在每次請求生成新的形象,所以我需要完全和WatiN一樣。也許一些綁定到IHtmlDocument什麼的? – 2011-01-07 17:15:09
@Baptiste Pernet - 謝謝你的回答,它解決了我的問題。再次感謝。 :) – Bibhu 2011-11-15 07:22:22