千图成像:用N张图片拼凑成一张图片。

实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块。

图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录每张图片的特征用于成像,增加成像质量。

起源

德莱文

图片局部

英雄联盟-微博

很久前在刷微博的时候看到了这条,被他给震撼到了,图片是由LOL近千张皮肤图片组合构成的(难道这是用ps做的,还是一张张拼的,应该不可能吧),就在昨天突然就想起了这个事,就决定也做一个,随即便展开了行动。

搜到了这篇文章,看了下图片的构成,决定先取得所有皮肤的图片再说吧!便又开始了爬虫!

运行环境:

Python3.6.5 , pycharm-2018-1-2 , win10

爬虫思路

皮肤图片的来源问题,首先到官网去找了找,想到了道聚城皮肤专卖区,其中正好有所有我们需要的图片。

通过F12锁定图片取得了第一张图片的URL(https://game.gtimg.cn/images/daoju/app/lol/medium/2-122015-9.jpg)

以此类推便可取得多个皮肤的URL,发现只有图中红框处不同

尝试着改变红框内的数字,在改变后三位(122015-->122001)时,获得了另一张诺手的皮肤,基本可以确定后三位为皮肤编号,前面的数字为英雄编号,且皮肤编号必须为三位。

看到这里你可能会有所疑问,为什么不直接正则获取所需图片的URL呢?为什么要大费周章的寻找规律?

因为这个翻页式网站比较特殊,在翻页时URL并不会改变,所以无法通过常用方法获取所有皮肤。

那估计又有人要提出使用selenium库来模拟人使用浏览器获取所有图片,但是这会造成爬取图片的速度大大下降,只能作为下策(在这过程中了解到了八爪鱼,发现其原理类似于selenium,是模拟人操控浏览器,速度也是不容直视,虽然它能爬取近98%的网站),在博主能力有限的情况下选择了寻找规律之旅!

如果你有好的方法解决这个问题,可以在评论处提出,十分感谢!

接下来在知道了规律的情况下,那么如何获取每个不同英雄的编号呢?在其他博主的引导下,发现LoL资料库中有所有英雄的头像,通过F12的慢慢查找,发现了这个js文件!

查看其preview,便可得到所有英雄编号,并测试发现可用!比如Ashe艾希的第一个皮肤对应编号按规律应该是22001,所以URL就是https://game.gtimg.cn/images/daoju/app/lol/medium/2-22001-9.jpg,

测试发现确实成功了!

好了,到此为止网页分析到此结束了,终于可以编写代码了。

代码框架

1、获取英雄编号及皮肤编号(说明:关于皮肤编号并未找到每个英雄皮肤的数量,所以设置成查找所有001到015的图片,当然也可以更多020也行)

2、将编号导入图片URL(https://game.gtimg.cn/images/daoju/app/lol/medium/2-****-9.jpg )中, 生成Url_list。

3,根据URL来下载对应图片,并保存到本地。

4、完整代码

import requestsimport reimport os# # # # # # # # # # # # # ## title:获取LOL英雄皮肤图像  ## author:简书 Wayne_Dream  ## date:2018-7-5           ## # # # # # # # # # # # # #defgetHero_data():    try:        headers = {            'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'        }        url = 'http://lol.qq.com/biz/hero/champion.js'        r = requests.get(url, headers=headers)        r.raise_for_status()        r.encoding = r.apparent_encoding        text = r.text        hero_id = re.findall(r'"id":"(.*?)","key"', text)        hero_num = re.findall(r'"key":"(.*?)"', text)        return hero_id, hero_num    except:        return '卧槽,获取英雄编码失败!'defgetUrl(hero_num):    part1 = 'https://game.gtimg.cn/images/daoju/app/lol/medium/2-'    part3 = '-9.jpg'    skin_num = []    Url_list = []    for i in range(1, 21):        i = str(i)        if len(i) == 1:            i = '00'+i        elif len(i) == 2:            i = '0'+i        else:            continue        skin_num.append(i)    for hn in hero_num:        for sn in skin_num:            part2 = hn + sn            url = part1 + part2 + part3            Url_list.append(url)    print('图片URL获取成功')    return Url_listdefPicName(hero_id, path):    pic_name_list = []    for id in hero_id:        for i in range(1, 21):            pic_name = path + id + str(i) + '.jpg'            pic_name_list.append(pic_name)    return pic_name_listdefDownloadPic(pic_name_list, Url_list):    count = 0    n = len(Url_list)    try:        for i in range(n):            headers = {                'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'            }            res = requests.get(Url_list[i], headers=headers).content            if len(res) < 100:                count += 1                print('\r当前进度:{:.2f}%'.format(100*(count/n)), end='')            else:                with open(pic_name_list[i], "wb") as f:                    f.write(res)                    count += 1                    print('\r当前进度:{:.2f}%'.format(100*(count/n)), end='')    except:        return '卧槽,获取图片失败!'if __name__ == '__main__':    print('author:简书 Wayne_Dream:')    print('https://www.jianshu.com/u/6dd4484b4741')    input('请输入任意字符开始爬虫:')    if os.path.exists('D:\LOLimg_wayne\\') == False:        path = r'D:\LOLimg_wayne\\'        os.mkdir(path)        hero_id, hero_num = getHero_data()        Url_list = getUrl(hero_num)        pic_name_list = PicName(hero_id, path)        print('正在下载图片,请稍等。。。')        print('在' + path + '下查看...')        DownloadPic(pic_name_list, Url_list)        print('图片下载完毕')    else:        path = r'D:\LOLimg_wayne\\'        hero_id, hero_num = getHero_data()        Url_list = getUrl(hero_num)        pic_name_list = PicName(hero_id, path)        print('正在下载图片,请稍等。。。')        print('在' + path + '下查看...')        DownloadPic(pic_name_list, Url_list)        print('图片下载完毕')

好了,到这里我们已经完成了LOL全皮肤的获取,接下来进行最有意思的一步,千图成像!

千图成像

初级阶段我们先使用一款国外的合成软件。

软件下载地址:

https://fmedda.com/en/download

如果打不开,那就搜索“foto-mosaik-edda”下载即可!

打开后界面是这样的。

先选第一步

再选第二步create photo mosaic

效果图:

局部:

如果想直接尝试一下千图成像的,可到百度网盘下载我爬取到的皮肤图集:https://pan.baidu.com/s/19PywbOV1dBwr7r7bzsMhmw 密码:5arb

- END -

原文链接:

https://www.jianshu.com/p/c963370cd8df

文源网络,仅供学习之用。如有侵权,联系删除。

往期精彩

◆  50款开源工具你都用过吗?

◆  python+C、C++混合编程的应用

◆  python网络爬虫的基本原理详解

◆  Python自动操控excel,一小时解决你一天的工作

◆  如何用Python增强Excel,减少处理复杂数据的痛苦?

python 爬取图片_Python实现千图成像:从图片爬取到图片合成相关推荐

  1. python千人成像_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  2. python 透明图片合成_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  3. Python---如何实现千图成像:初级篇(从图片爬取到图片合成)

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  4. ps入门第20天_ps批处理_ps动作的编辑与创建 案例:千图成像

    一前言 二操作步骤 1.录制动作 ①窗口---动作---创建文件夹 ②创建新动作---命名 ③点击开始记录 ④点击裁剪---按住shift---裁剪出正方形 ⑤文件---存储为 找个任意的文件夹存放即 ...

  5. 爬虫第二弹:千图网电商淘宝模板图片下载

    爬虫第二弹:千图网电商淘宝模板图片下载  一.功能分析: 1.下载千图网电商淘宝的所有模板图片要求是高清版本: 2.并按照主页面将图片归类文件夹.   二.思路分析: 1.利用scrapy构建scra ...

  6. python爬取千图网图片并保存_Python数据分析与挖掘实战-课程作业5爬取千图网某个频道的高清图片...

    作业要求:爬取千图网(http://www.58pic.com)某个频道的高清图片 作业难点:正确找到图片链接并用正则表达式写出 代码如下: """ Created on ...

  7. python怎么批量爬取图片_python批量爬取网络图片

    上篇通过python爬取了一篇网络小说,初步了解了爬虫的四步流程,本文稍微扩展一点,试着从网页中爬取出多个图片,具体来看看: 我们今天试着从下面图1的网页上将所有图片都爬取出来,放在一个指定的文件夹里 ...

  8. python爬取图片_python批量爬取网络图片

    上篇通过python爬取了一篇网络小说,初步了解了爬虫的四步流程,本文稍微扩展一点,试着从网页中爬取出多个图片,具体来看看: 我们今天试着从下面图1的网页上将所有图片都爬取出来,放在一个指定的文件夹里 ...

  9. python爬取图片的库_16-python爬虫之Requests库爬取海量图片

    Requests 是一个 Python 的 HTTP 客户端库. Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和P ...

最新文章

  1. SharePoint 2013 如何使用TaxonomyWebTaggingControl 控件
  2. 【收藏】使用命令行创建maven web项目
  3. CentOS7使用firewalld打开关闭防火墙与端口(转载)
  4. Linux IO 测试工具 fio命令
  5. aspx 页面,master页面与ascx用户控件传值的问题
  6. 字符串startswith_Python字符串startswith()
  7. 容器技术学习系列文章总目录
  8. 【快学springboot】使用springboot发送邮件
  9. 二叉树遍历算法(递归实现+层次遍历)
  10. spring5-介绍Spring框架
  11. 创维hc2800 产品规格书
  12. dBm 转 W 换算
  13. DoEvents应用
  14. 技术团队管理者的软技能(上):关于团队文化和领导力
  15. 使用华为光猫ONT使能工具后,本地主机如何通过Telnet登录光猫进行配置
  16. Linux shell的输入输出
  17. html5悬浮效果,html5悬浮球效果
  18. CSGO 绑定一键跳投
  19. 玩客云刷上Armbian的体验
  20. 使用DPDK优化VirtIO和OVS网络

热门文章

  1. jquery 点击li循环高亮显示
  2. [winphone][C#]MAC算法的实现
  3. “刷榜客”-- 手机木马Google Play恶意刷榜
  4. 获取人民币对各币种的汇率
  5. Borland C++ 3.1 for DOS 中directvideo的问题
  6. [转]较全的OA系统功能模块需求描述
  7. python字符串中的数字提取
  8. C# 通过串口发送短信
  9. 感谢漫威,感谢斯坦李,还有,谢谢你
  10. 51单片机篮球计分器C语言,基于51单片机的篮球计分器设计