您的位置:首页 > 编程语言 > C#

C#获取网页中指定图片的方法

2014-07-04 10:12 204 查看
获取网页中指定图片是许多程序员都会面临的问题。对于不随源url刷新而变化的图片,可以通过获取图片url的方法确定图片。但是对于随源url刷新而变化的图片(如验证码),则不能通过源url确定。另外即便图片不随源url变化而改变,但是通过源url得到的也只是包含该图片的一个网页,仍然面临着将网页中图片提取为图片的工作。本文我将向大家介绍一种MSDN上的方法,该方法可以将网页中指定的图片获取为图片格式。参考资料网址

首先在项目中,引入Microsoft.mshtml,然后在代码中添加命名空间using mshtml;

然后在项目中添加如下代码:

///<summary>
/// 获取WebBrowser指定的图片
/// </summary>
/// <param name="webBrowser">需要获取图片的WebBrowser</param>
/// <param name="imgID">指定的图片的id(优先查找指定id)</param>
/// <param name="imgSrc">指定的图片的src,支持模糊查询</param>
/// <param name="imgAlt">指定的图片的src, 支持模糊查询</param>
/// <returns></returns>
public static Image GetRegCodePic(ref WebBrowser webBrowser, String imgID, String imgSrc, String imgAlt)
{

HTMLDocument doc = (HTMLDocument)webBrowser.Document.DomDocument;
HTMLBody body = (HTMLBody)doc.body;
IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange();
IHTMLControlElement img;

// 如果没有图片的ID,通过Src或Alt中的关键字来取
if (imgID.Length == 0)
{
Int32 ImgNum = GetPicIndex(ref webBrowser, ref imgSrc, ref imgAlt);

if (ImgNum == -1)
return null;

img = (IHTMLControlElement)webBrowser.Document.Images[ImgNum].DomElement;
}
else
img = (IHTMLControlElement)webBrowser.Document.All[imgID].DomElement;

rang.add(img);
rang.execCommand("Copy", false, null);
Image regImg = Clipboard.GetImage();
Clipboard.Clear();
return regImg;
}

/// <summary>
/// 获取WebBrowser指定图片的索引
/// </summary>
/// <param name="webBrowser">指定的WebBrowser</param>
/// <param name="imgSrc">指定的图片src,支持模糊查询</param>
/// <param name="imgAlt">指定的图片alt,支持模糊查询</param>
/// <returns></returns>
public static Int32 GetPicIndex(ref WebBrowser webBrowser, ref String imgSrc, ref String imgAlt)
{
IHTMLImgElement img;

// 获取所有的Image元素
for (Int32 i = 0; i < webBrowser.Document.Images.Count; i++)
{
img = (IHTMLImgElement)webBrowser.Document.Images[i].DomElement;

if (imgAlt.Length == 0)
{
if (img.src.IndexOf(imgSrc) >= 0)
return i;
}
else
{
if (imgSrc.Length == 0)
{
// 当imgSrc为空时,只匹配imgAlt
if (img.alt.IndexOf(imgAlt) >= 0)
return i;
}
else
{
// 当imgSrc不为空时,匹配imgAlt和imgSrc任意一个
if (img.alt.IndexOf(imgAlt) >= 0 || img.src.IndexOf(imgSrc) >= 0)
return i;
}
}
}
return -1;
}
这是MSDN上的原始代码,在实际应用中可以根据自己的实际情况加以修改。

如:我要从新浪登陆界面上提取一个id为img_check的验证码图片,并将获得的图片保存到一个picturebox中,截图如下:



我的代码如下:

HTMLDocument doc = (HTMLDocument)webBrowser1.Document.DomDocument;
HTMLBody body = (HTMLBody)doc.body;
IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange();
IHTMLControlElement img;
img = (IHTMLControlElement)webBrowser1.Document.All["check_img"].DomElement;
rang.add(img);
rang.execCommand("Copy", false, null);
Image regImg = Clipboard.GetImage();
Clipboard.Clear();
pictureBox_Code.Image = regImg;
运行结果如下:



希望这篇文章能对大家有所帮助。有需要交流的朋友可以发邮件到mushaoqiong@126.com,我会尽快回复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: