C++根据图片url下载图片

需要使用到URLDownloadToFile()函数,该函数在头文件<urlmon.h>中声明。

URLDownloadToFile()函数的定义如下:

复制代码
1 HRESULT URLDownloadToFile( 
2     LPUNKNOWN pCaller,
3     LPCTSTR szURL,
4     LPCTSTR szFileName,
5     DWORD dwReserved,
6     LPBINDSTATUSCALLBACK lpfnCB
7 );
复制代码

Parameters(参数含义):


 

pCaller

Pointer to the controlling IUnknown interface of the calling Microsoft ActiveX component (if the caller is an ActiveX component).

Microsoft ActiveX控件的接口的指针,如果不是控件,则为NULL

szURL

Pointer to a string value containing the URL to be downloaded. Cannot be set to NULL

要下载的url地址,不能为空

szFileName

Pointer to a string value containing the name of the file to create for bits that come from the download.

下载后保存的文件名

dwReserved

Reserved. Must be set to 0.

保留字段,必须为0

lpfnCB

Pointer to the caller's IBindStatusCallback interface. URLDownloadToFile calls this interface's IBindStatusCallback::OnProgress method on a connection activity, including the arrival of data. IBindStatusCallback::OnDataAvailable is never called.

下载进度状态回调

 

Return Value
Returns one of the following values.
S_OK : The download started successfully.
E_OUTOFMEMORY: The buffer length is invalid, or there is insufficient memory to complete the operation.
INET_E_DOWNLOAD_FAILURE:The specified resource or callback interface was invalid.
 
由于函数的参数使用的是LPWSTR,而我们常用的是string,所以用到了MultiByteToWideChar()函数将string转为LPWSTR
 
代码如下
复制代码
 1 /*
 2 @author:CodingMengmeng
 3 @theme:C++根据图片url下载图片
 4 @time:2017-1-6 22:58:00
 5 @blog:http://www.cnblogs.com/codingmengmeng/
 6 */
 7 #include <tchar.h>
 8 #include <iostream>
 9 #include <urlmon.h>
10 /*
11 #pragma comment(lib,"urlmon.lib")作用:
12 连接静态库到项目中,效果等同于:
13 项目属性——链接器——输入——附加依赖项中加入这个lib
14 (头文件<urlmon.h>中只是包含了数据结构和函数声明,是编译阶段;
15 链接阶段将从静态库中恢复这些函数和数据并把他们和应用程序中的其它模块组合在一起生成可执行文件,
16 该过程称为“静态链接”)
17 */
18 #pragma comment(lib,"urlmon.lib")
19 using namespace std;
20 
21 int _tmain(int argc, char* argv[])
22 {
23     string url = "http://pic104.nipic.com/file/20160715/6171480_185807154956_2.jpg";
24     size_t len = url.length();//获取字符串长度
25     int nmlen = MultiByteToWideChar(CP_ACP, 0, url.c_str(), len + 1, NULL, 0);//如果函数运行成功,并且cchWideChar为零,
26     //返回值是接收到待转换字符串的缓冲区所需求的宽字符数大小。
27     wchar_t* buffer = new wchar_t[nmlen];
28     MultiByteToWideChar(CP_ACP, 0, url.c_str(), len + 1, buffer, nmlen);
29     HRESULT hr = URLDownloadToFile(NULL, buffer,_T("E:\\C++lianxi\\Blog\\urlDownload2File\\urlDownload2File\\sky.jpg"), 0, NULL);
30     if (hr == S_OK)
31     {
32         cout << "ok" << endl;
33     }
34     return 0;
35 }
复制代码

 

运行结果

 

程序输出ok,且在指定目录中也保存了下载到的图片。 

以上。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
类似网络爬虫,从一个网页“爬”到另一个网页,然后选择图片下载。多线程。 可以用来按照一定规则下载网页中的元素,如图片、网页、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、付费专栏及课程。

余额充值