如何在网络浏览器中将加载的图像复制到picturebox
本文关键字:图像 复制 picturebox 加载 网络 浏览器 | 更新日期: 2023-09-27 18:24:42
是否有任何方法可以将加载的图像从web浏览器捕获或复制到图片框中?
我正在尝试复制的图像是"captcha"图像,每个请求都会更改。我需要网络浏览器中加载的图像与图片框相同。
我已尝试拆分img
标签并再次请求该图像。它起了作用,但图片框图像与网络浏览器显示的图像不同。
以下是我迄今为止所做的工作。它包含一个网络浏览器、一个图片框、一个文本框和一个按钮
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
namespace arman_dobare_kir_mishavad
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string str2 = webBrowser1.DocumentText;
string[] strArray2;
strArray2 = Regex.Split(Regex.Split(str2, "<img id='"content1_imgCaptcha'" src='"")[1], "'"");
textBox1.Text = strArray2[0];
this.pictureBox1.ImageLocation = "http://www.hashkiller.co.uk" + strArray2[0];
return;
}
public void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
}
}
}
这是一个相当棘手的问题,我花了几个月的时间才解决。第一件事。正如您所发现的,几乎所有的captcha图像都是动态生成的图像,这意味着每次您请求图像时,即使url(src标签)相同,也总是会生成一个新的captcha-image。
解决这个问题的最佳方法是从网络浏览器中"剪切"已经加载的captcha图像。相信我,这是最好的方式,如果不是唯一的方式。
好消息是,使用内置的方法可以很容易地完成
webBrowser.DrawToBitmap(位图,矩形)
我的示例代码:(如何对特定元素使用webbrowser.DrawToBitmap)
private void button1_Click(object sender, EventArgs e)
{
int CaptchaWidth = getXoffset(webBrowser1.Document.GetElementById("Captch-Element-Name"));
int CaptchaHeight = getYoffset(webBrowser1.Document.GetElementById("Captch-Element-Name"));
Bitmap bitmap = new Bitmap(CaptchaWidth, CaptchaHeight);
webBrowser1.DrawToBitmap(bitmap, new Rectangle(0, 0, CaptchaWidth, CaptchaHeight));
//now load the image into your pictureBox (you might need to convert the bitmap to a image)
}
//Methods to get Co-ordinates Of an Element in your webbrowser
public int getXoffset(HtmlElement el)
{
int xPos = el.OffsetRectangle.Left;
HtmlElement tempEl = el.OffsetParent;
while (tempEl != null)
{
xPos += tempEl.OffsetRectangle.Left;
tempEl = tempEl.OffsetParent;
}
return xPos;
}
public int getYoffset(HtmlElement el)
{
int yPos = el.OffsetRectangle.Top;
HtmlElement tempEl = el.OffsetParent;
while (tempEl != null)
{
yPos += tempEl.OffsetRectangle.Top;
tempEl = tempEl.OffsetParent;
}
return yPos;
}
因此,坏消息是,c#在drawtobitmap方法中有一个令人讨厌的小错误(msdn网站上提到了这个错误)。有时运行时会返回一个空白图像……是的。。。当你试图破解Captchas时,这并不是你想要的!
幸运的是!另一位stackOverflow用户和我花了几个月的时间研究这个方法的无错误版本,该版本使用了原生GDI+。
而且它工作得很好,所以如果drawtobitmap不能像你期望的那样工作,这里有一个替代方案。
样品:
[DllImport("user32.dll")]
public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags);
public Bitmap CaptureWindow(Control ctl)
{
//Bitmap bmp = new Bitmap(ctl.Width, ctl.Height); // includes borders
Bitmap bmp = new Bitmap(ctl.ClientRectangle.Width, ctl.ClientRectangle.Height); // content only
using (Graphics graphics = Graphics.FromImage(bmp))
{
IntPtr hDC = graphics.GetHdc();
try { PrintWindow(ctl.Handle, hDC, (uint)0); }
finally { graphics.ReleaseHdc(hDC); }
}
return bmp;
}
因此,您只需拨打:CaptureWindow(webBrowser1);这将返回整个网络浏览器的图像,然后剪下包含captcha图像的部分。
你可以查看我的问题,如果我在这里有类似的问题(大多数问题甚至没有得到回答):
从WebBrowser控件中提取图像
屏幕截图方法生成黑色图像
重置浏览器控件以更新设置
既然你有了captcha图像,你就需要解密它们。所以再问一个问题,把链接发给我,我会分享我的方法。我很高兴你不用忍受我的噩梦。别忘了将此标记为解决方案,并将其标记为有用的解决方案!