VC 从网页上下载图片

本文介绍如何使用Windows下的WinINet API进行图片下载。具体步骤包括:通过InternetOpenUrl建立连接,读取文件数据,保存至本地,最后关闭连接。文章提供了完整的MFC示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显示网页上图片的方法:

(1)首先获取网页上我们所需要图片的链接地址(即URL);

(2)根据链接地址下载图片并保存在一个temp文件夹中;

(3)把刚刚下载的文件保存在所要显示的控件上;

(4)程序最后删除刚刚所下载的文件,即temp文件夹中的所有文件。

 

这里我主要是实现第二步,第一步的地址我们假设已经知道,例如本例中所用到的地址是http://hiphotos.baidu.com/dontcry1015/pic/item/07b421e63576b831b8382044.jpg

这个是我在百度里随便百度找到的,如有侵权,望告知。

 

首先我们先来了解InternetOpenUrl 这个函数:

 

HINTERNET InternetOpenUrl (__in HINTERNET hInternet ,__in LPCTSTR lpszUrl ,__in LPCTSTR lpszHeaders ,__in DWORD值dwHeadersLength ,__in的DWORD dwFlags ,__in DWORD_PTR dwContext);

参数 
hInternet 
当前的 Internet 会话句柄。句柄必须由前期的 InternetOpen 调用返回。
lpszUrl 
一个空字符结束的字符串变量的指针,指定读取的网址。只有以ftp:, gopher:, http:, 或者 https: 开头的网址被支持。
lpszHeaders 
一个空字符结束的字符串变量的指针,指定发送到HTTP服务器的头信息。欲了解更多信息,请参阅HttpSendRequest函数里lpszHeaders参数的说明。
dwHeadersLength 
额外的头的大小,以TCHAR为单位。如果这个参数是-1L并且lpszHeaders不是NULL,lpszHeaders被假设为零终止( ASCIIZ ),而长度被自动计算。
dwFlags 
此参数可为下列值之一。
数值 说明

INTERNET_FLAG_EXISTING_CONNECT 
如果使用相同的必须属性创建会话,会尝试利用现有的InternetConnect对象。这只对FTP操作非常有用,因为FTP是唯一在同一会话中执行多种操作的协议。WinINet API 为每个由InternetOpen产生的HINTERNET句柄缓冲一个单独链接句柄。InternetOpenUrl使用此标志的HTTP和FTP连接。


INTERNET_FLAG_HYPERLINK 
当决定何时从网络重载时,如果服务器没有返回 Expires time 和 LastModified,那么强制重载。 

INTERNET_FLAG_IGNORE_CERT_CN_INVALID 
停用检查从服务器对必须的主机名称返回的SSL/PCT-based证书。 WinINet函数使用简单的比较匹配主机名称和通配符的规则检查证书。 

INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 
停用检查的SSL/PCT-based的证书的适当的有效日期。 

INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 
禁用检测这中特殊的重定向。当使用此标志, WinINet 透明允许从HTTPS到HTTP URL的重定向。 

INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 
禁用检测这中特殊的重定向。当使用此标志, WinINet 透明的允许的HTTP到HTTPS URL的重定向。 

INTERNET_FLAG_KEEP_CONNECTION 
如果可能的话,为连接使用保活语义。这个标志要求微软网络( MSN ),NTLM和其他类型的身份验证。 

INTERNET_FLAG_NEED_FILE 
如果要创建的文件不能被缓存,创建临时文件。 

INTERNET_FLAG_NO_AUTH 
不试图自动验证。 

INTERNET_FLAG_NO_AUTO_REDIRECT 
不自动处理HttpSendRequest中的重定向。 

INTERNET_FLAG_NO_CACHE_WRITE 
不添加返回实体到缓存。 

INTERNET_FLAG_NO_COOKIES 
不会自动添加的Cookie头到请求,并且不自动添加返回的cookie到cookie数据库。 

INTERNET_FLAG_NO_UI 
禁用Cookie的对话框。 

INTERNET_FLAG_PASSIVE 
使用被动FTP语义。InternetOpenUrl为FTP的文件和目录使用此标志。 

INTERNET_FLAG_PRAGMA_NOCACHE 
即使代理中存在缓存副本,也强制要求由源服务器返回。 

INTERNET_FLAG_RAW_DATA 
检索的Gopher目录信息时,传回的数据作为GOPHER_FIND_DATA结构,如果检索的FTP目录信息时,作为一个WIN32_FIND_DATA结构。如果此标志没有指定,或者请求通过CERN代理创建, InternetOpenUrl返回的HTML版本的目录。 

INTERNET_FLAG_RELOAD 
从原服务器强制下载所要求的文件,对象,或目录列表,而不是从缓存下载。 

INTERNET_FLAG_RESYNCHRONIZE 
重新加载的HTTP资源,如果资源在最后一次下载后已被修改。所有FTP和Gopher资源将被重载。 

INTERNET_FLAG_SECURE 
使用安全传输语义。这次传输使用安全套字节层/专用通信技术(的SSL / PCT ),这只有在HTTP请求时有意义。 


dwContext 
一个指向一个应用程序定义的值,将随着返回的句柄,一起传递给回调函数。 

返回值 
如果已成功建立到FTP,Gopher,或HTTP URL的连接,返回一个有效的句柄,如果连接失败返回NULL。要检索特定的错误讯息,使用GetLastError 函数。要确定为什么对服务器的访问被拒绝,请调用InternetGetLastResponseInfo函数。

接着我们再学习一下InternetReadFile这个函数,这个大家自学,这里就不多说了。

下面是实例,在MFC下实现的

void CXXXDlg::OnBnClickedButton1()
{
 LPCTSTR   url =_T("http://hiphotos.baidu.com/dontcry1015/pic/item/07b421e63576b831b8382044.jpg");
 LPCTSTR   fileName=_T("c://a1.jpg");//保存临时文件的地址
 HINTERNET hNet= ::InternetOpen(_T(""), PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);  

 HINTERNET hUrlFile = ::InternetOpenUrl(hNet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
 char buffer[1024];
 DWORD dwBytesRead = 1;   
 BOOL bRead = TRUE;
 CFile file;
 BOOL bCheck = file.Open(fileName,CFile::modeCreate|CFile::modeWrite);
 if (bCheck == FALSE)
 {
  AfxMessageBox(_T("打开文件失败"));
  return;
 }
 while ( bRead&&dwBytesRead>0 )   
 {
  bRead = ::InternetReadFile(hUrlFile, buffer, sizeof(buffer), &dwBytesRead);
  
  if( dwBytesRead>0 )
   file.Write(buffer,dwBytesRead);
 }   
 ::InternetCloseHandle( hUrlFile );   
 ::InternetCloseHandle( hNet );
 file.Close();
}

 

转自:http://blog.youkuaiyun.com/aidy22/article/details/4454496

类似网络爬虫,从一个网页“爬”到另一个网页,然后选择图片下载。多线程。 可以用来按照一定规则下载网页中的元素,如图片网页、flash等,举例如下: 1. 下载sohu主页的所有图片 在地址栏中输入www.sohu.com,在“选项”中将最大下载图片数目设为0,最大访问网页数设为1,点开始即可。 2. 下载sohu主页及其子链接中的所有图片,共下载100张 在“选项”中将最大下载图片数目设为100,最大访问网页数设为0 3. 下载人人网中的相册 打开相册中的一张相片,如http://photo.renren.com/getphoto.do?id=975410152&owner=230410031&curpage=0&t=#975410152,将地址复制到软件的地址栏(注意要将窗口拉长,使得地址栏足够容下这个地址,否则地址会被切断,这个bug我一直没找到解决办法)。 接下来需要一点观察。先看要下载图片链接(http://fmn017.xnimg.cn/fmn017/pic001/20080926/17/21/large_wJZc_3213f200058.jpg),再看下一张,是http://fmn014.xnimg.cn/fmn014/pic001/20080926/17/21/large_Ao10_3208l200058.jpg,找到其中的公共部分,不妨取为xnimg.cn/fmn,将其输入“选项”中的“图片路径含有”,并勾选复选框。 再观察“上一张”、“下一张”的链接(http://photo.renren.com/getphoto.do?id=975410152&owner=230410031&curpage=0&t=#975409483)(http://photo.renren.com/getphoto.do?id=975410152&owner=230410031&curpage=0&t=#975410114),取其公共部分photo.renren.com/getphoto.do,填入“网页路径含有”并勾选复选框。 最后将最大下载图片数目和最大访问网页数都设为0,点开始即可。上面限制了图片网页路径,只是为了防止下载不需要的图片。 4. 一次性在你的100个好友的页面上留下脚印 观察所有个人主页链接url,取出公共部分http://renren.com/profile.do,剩下的我就不用说了吧……对了,要是一张图片都不想下载,只要在“图片路径含有”中输入一个空格就可以了,因为任何图片url都不包含空格…… 5. 下载一部小说目录中的所有链接 提示:“选项”中有一个小小的“高级”按钮,有兴趣的同志可以研究一下…… ps. 大家可能看出来了,这个软件很类似网络爬虫,从一个网页“爬”到另一个网页,然后选择图片下载。如果有人需要根据关键词从大的图片搜索引擎下载图片,我推荐crazyPic这个软件。我这个软件的用途我暂时就想出这么多,欢迎发掘更多用途,也欢迎挑bug!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值