Python---如何实现千图成像:初级篇(从图片爬取到图片合成)
千图成像:用N张图片拼凑成一张图片。
实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块。
图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录每张图片的特征用于成像,增加成像质量。
0,起源
很久前在刷微博的时候看到了这条,被他给震撼到了,图片是由LOL近千张皮肤图片组合构成的(难道这是用ps做的,还是一张张拼的,应该不可能吧),就在昨天突然就想起了这个事,就决定也做一个,随即便展开了行动。搜到了这篇文章,看了下图片的构成,决定先取得所有皮肤的图片再说吧!便又开始了爬虫!
- 运行环境:Python3.6.5 , pycharm-2018-1-2 , win10
1.爬虫思路
- 皮肤图片的来源问题,首先到官网去找了找,想到了道聚城皮肤专卖区,其中正好有所有我们需要的图片。
- 通过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,测试发现确实成功了!
- 好了,到此为止网页分析到此结束了,终于可以编写代码了!
2,代码框架
- 1,获取英雄编号及皮肤编号(说明:关于皮肤编号并未找到每个英雄皮肤的数量,所以设置成查找所有001到015的图片,当然也可以更多020也行)
- 2,将编号导入图片URL(https://game.gtimg.cn/images/daoju/app/lol/medium/2-******-9.jpg)中,生成Url_list。
- 3,根据URL来下载对应图片,并保存到本地。
3,完整代码
代码写的比较丑,如有看不懂的部分可在评论区提出,我会秒回你的!/认真脸
好了,到这里我们已经完成了LOL全皮肤的获取,接下来进行最有意思的一步,千图成像!(文末有我爬取到的皮肤图集百度网盘地址)
4,初级阶段我们先使用一款国外的合成软件
- 如果打不开,那就搜索“foto-mosaik-edda”下载即可!
打开后界面是这样的。
先选第一步
再选第二步create photo mosaic
有时间再分享如何用python实现这个软件的功能…………
如发现错误或看不懂的地方,可在评论区提出,大家一起交流!
如果苦于没有大量图片来进行成像,可到百度网盘下载我爬取到的皮肤图集,https://pan.baidu.com/s/19PywbOV1dBwr7r7bzsMhmw 密码:5arb
- *转载请注明出处
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java并发编程笔记之 CountDownLatch闭锁的源码分析
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountDownLatch 与 线程的 join 方法区别是什么? 日常开发中经常会遇到需要在主线程中开启多线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景,它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的初始值必须大于0。另外它还提供了一个countDown方法来操作计数器的值,每调用一次countDown方法计数器都会减1,直到计数器的值减为0时就代表条件已成熟,所有因调用await方法而阻塞的线程都会被唤醒。这就是CountDownLatch的内部机制,看起来很简单,无非就是阻塞一部分线程让其在达到某个条件之后再执行。但是CountDownLatch的应用场景却比较广泛,只要你脑洞够大利用它就可以玩出各种花样。最常见的一个应用场景是开启多个线程同时执行某个任务,等到所有任务都执行完再统计汇总结果。下图动态演示了闭锁阻塞线程的整个过程。 在Co...
- 下一篇
Java编程微服务架构框架-监控与管理(SpringBoot)
在微服务架构中,我们将原本庞大的单体系统拆分成多个提供不同服务的应用。 虽然 各个应用的内部逻辑因分解而得以简化,但是由于部署应用的数量成倍增长,使得系统的 维护复杂度大大提升。 对于运维人员来说,随着应用的不断增多,系统集群中出现故障的 频率也变得越来 越高,虽然在高可用机制的保护下,个别故障不会影响系统的对外服务, 但是这些频繁出现的故障需要被及时发现和处理才能长期保证系统处千健康可用状态。 为 了能对这些成倍增长的应用做到高效运维,传统的运维方式显然是不合适的,所以我们需 要实现一套自动化的监控 运维机制,而这套机制的运行基础就是不间断地收集各个微服务 应用的各项 指标情况,并根据这些基础指标信息来制定监控和预警规则,更进一步甚至做 到一些自动化的运维操作等。 为了让运维系统能够获取各个微服务应用的相关指标以及实现一些常规操作控制,我 们需要开发一套专门用于植入各个微服务应用的接口供监控 系统采集信息。 而这些接口往 往有很大一 部分指标都是类似的, 比如环境变量、 垃圾收集信息、 内存信息、 线程池信息 等。 既然这些信息那么通用,难道就没有一个标准化的实现框架吗? 当我们决定...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Mario游戏-低调大师作品
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G