[ller必读] LoveLive! 必备技能之 Python Pillow 自动处理截图

起因



喜欢的歌,静静地听;喜欢的人,远远的看。30天前,就是3月14号,我情不自禁地走近了《LoveLive!学院偶像祭》,这是我的第一张卡片(见下图)。第二天也就是3月15日,海未生日了。

 

之后我一直搜集游戏过程中遇到的卡片(截屏),卡片本身有一定的比例,而我的手机屏幕分辨率是 1920x1080,截完的图像下面这样。整个游戏界面并没有充满屏幕,所以有黑边;卡片比游戏界面小,截出的图很不美观而且方向不正。

中间的卡片的区域是 1080x1520

我本人并不是处女座,然而也不能忍受不美好的事物。于是一步一步地走上了程序员这条路。

我以为做程序员可以填满人生的遗憾。然而,制造更多遗憾的。却偏偏是做程序员。

(问:一个什么都拥有的程序猿他还缺少什么?)

非程序员的解决办法


while( true )
{
    用 PS 打开截图;
    添加辅助线;
    裁剪区域;
    旋转正图像;
    sit,不对,是save;
}

没图你说个毛啊!!!

谁说我没图,看图文并茂:

这些卡片在app中是以3位数字作为id编号的,可见数量实在不少。

这样不断循环,耗时费力,截完后累觉不爱了 :-(

Pythoner 的解决办法


第一版的程序

实现功能:处理图像(裁剪 + 旋转)

废话的流程图

程序代码大致是这样的:

运行后的结果,黑斑也没有了,头也不歪了,还有了新后缀,Ta好我也好:

第二版的程序


改进之处:图片文件自动命名

图片的命名规则:人物名字_属性_等级_星星数-N.png (其中N为正整数)

例如上图中的海未应该如此命名,园田海未_Pure_R_3-1.png

程序思路

1.人物名字如何命名?

建立相应的文件夹,将截图分类放到对应的文件夹下面,脚本获取文件夹名作为新名字的第一部分。

2.属性如何确认?

比较各张截图,人物卡片的右下角在固定位置有相同大小的圆圈,我们取坐标点 (920, 1400) 的 RGB 值判断。

 

下图右边是我一开始定义的字典,左边是运行过程中打印出来的 color

3.如何确定星星数(也就是角色的稀有度)?

搞完了右下角,我们来搞左下角。再做几条辅佐线,以确定来自星星的你的距离。

部分细心的读者肯定看到我从 ps 转向了 狗(嗯,我不记得软件的名字,除了图标)。

纵坐标大概递加 55px,获取坐标点的 color 值,如果不是 (8, 4, 34, 255) 计数变量的值就加1。

发现第二个元素的值有一点差别,其实也可以取指定位置的元素用来判断。

 

为了阅读的方便,数星星的代码搬到了这里。

def get_count_of_star(image):
    count = 0
    positon_of_star = (33, 1090)    #星星的初始位置,但星星是会运动的
    for i in range(0,8):            #[0,8) 星星最多有8个
        color = image.getpixel(positon_of_star)         #星星有发亮吗?
        positon_of_star = (33, positon_of_star[1]+55)   #坐标下移到下一个星星处
        if color[2] != 34:          #只比较第三个元素
            count += 1              #不是暗的,说明星星是有效的
    return count

参数 image 是已打开的图像,返回发亮星星的个数。

4.如何确定左上角的等级?

另外因为我不会文字识别,左上角的等级字符就无法获取,但是并不表示就不能解决这个问题。

观察众多的卡片发现了一条得到等级的捷径,这条捷径就是等级跟星星数是有对应关系的:


等级(左上角)


星星数(左下角)

N 1,  2
R 3,  4
SR 5,  6
UR 7,  8

有时只要转换一下思考的角度,也同样能解决问题。

代码设计



(一)工作路径相关

import os
os.getcwd() # 查看当前工作目录
os.chdir("/home/luoxu") # 改变目录

for root, dirs, files in os.walk(dir):
    for name in files:
        print os.path.join(root, name)

os.listdir 可以列出 dir 里面的所有文件和目录,但不包括子目录中的内容
os.walk 可以遍历下面的所有目录,包括子目录,返回路径,路径下目录的元组和文件的元祖。

(二)获取某个目录下的 png 图像文件

glob 是 python 自带的一个文件操作相关模块,可以用来查找匹配的文件。

import glob
glob.glob(‘/home/luoxu/*.png‘)

参数是某个路径字符串,字符串可以为绝对路径也可以为相对路径,字符串最后部分表示匹配的文件类型。

*, ? , [ ] 三个通配符,* 代表 0 个或多个字符,? 代表一个字符,[ ] 匹配指定范围内的字符,如[0-9]匹配数字。

该方法返回所有匹配的文件路径列表。

(三)图像处理相关

图像处理用的是 Pillow 模块,官方网站上有手册 http://effbot.org/zone/pil-index.htm

from PIL import Image
im = Image.open("lenna.jpg")      #打开图像
box = (200, 0, 1720, 1080)
im.crop(box)                      #按box的对角坐标裁剪区域
im.transpose(Image.ROTATE_90)     #逆时针旋转90度
im.save(‘newFileName.png‘, "PNG") #保存新的图像文件newFileName.png
color = i.getpixel((920,1400))    #获取某像素点的rgb值

脚本只用这几个方法,更详细的细节还是使用的时候去阅读文档。

(四)一些变量的说明

box = (200, 0, 1720, 1080)

原图是1920x1080,裁剪后是1520x1080,对角(200,0), (1720,1080)

POSITION = (920,1400)

右下角确定属性用的,通过 getpixel(POSITION) 方法获得的值有三种情况:

attributes = {‘Smile‘:(234,0,115,255),
              ‘Pure‘ :(34,170,85,255),
              ‘Cool‘ :(0,153,238,255)
             }

星星数和等级的映射表

grade = {1:‘N‘, 2:‘N‘,
         3:‘R‘, 4:‘R‘,
         5:‘SR‘, 6:‘SR‘,
         7:‘UR‘, 8:‘UR‘
        }

(五)数星星

回去看上文相关的部分。

(六)另外

我再提供两张截图,如果读者愿意可以拿去测试代码,不一样的是,不需要旋转,裁剪区域不同。

完整的脚本代码 [image-processing.py] :

 1 #!/usr/bin/env python3.5
 2 # -*- coding:utf-8 -*-
 3
 4 from PIL import Image
 5 import glob, os
 6
 7 box = (200, 0, 1720, 1080)  #裁剪区域
 8 POSITION = (920,1400)       #属性坐标
 9
10 #属性-颜色映射
11 attributes = {‘Smile‘:(234,0,115,255),
12               ‘Pure‘ :(34,170,85,255),
13               ‘Cool‘ :(0,153,238,255)
14              }
15 #星星数-等级映射
16 grade = {1:‘N‘, 2:‘N‘,
17          3:‘R‘, 4:‘R‘,
18          5:‘SR‘, 6:‘SR‘,
19          7:‘UR‘, 8:‘UR‘
20         }
21
22 def image_processing(dirpath, dirname):
23     os.chdir(dirpath + ‘/‘ + dirname)
24 ##    print(dirpath + dirname)
25     s_cnt = p_cnt = c_cnt = 1
26     images = glob.glob(‘*.png‘)     #获取所有png文件
27     for image in images:
28         try:
29             im = Image.open(image)
30             new_im = im.crop(box).transpose(Image.ROTATE_90)    #裁剪和旋转
31 ##            filename, ext = os.path.splitext(image)
32 ##            new_im.save(filename + "-new.png", "PNG")
33             color = new_im.getpixel(POSITION)                   #属性坐标->颜色元组
34             count = get_count_of_star(new_im)                   #判断星星的数量
35             if color == attributes[‘Smile‘]:                    #确认颜色对应Smile属性
36                 new_im.save(dirname + "_Smile_{grade}_{count}-{number}.png".format(grade=grade[count],count=count,number=s_cnt), "PNG")
37                 s_cnt += 1
38             elif color == attributes[‘Pure‘]:
39                 new_im.save(dirname + "_Pure_{grade}_{count}-{number}.png".format(grade=grade[count],count=count,number=p_cnt), "PNG")
40                 p_cnt += 1
41             elif color == attributes[‘Cool‘]:
42                 new_im.save(dirname + "_Cool_{grade}_{count}-{number}.png".format(grade=grade[count],count=count,number=c_cnt), "PNG")
43                 c_cnt += 1
44             else:
45                 new_im.save(dirname + "-new.png", "PNG")
46
47         except IOError:
48             print(‘{}: io error!‘.format(image))
49
50     print(dirname + ‘:finished.‘)
51
52
53 def get_count_of_star(image):
54     count = 0
55     positon_of_star = (33, 1090)    #星星的初始位置,但星星是会运动的
56     for i in range(0, 8):           #[0,8) 星星最多有8个
57         color = image.getpixel(positon_of_star)         #星星有发亮吗?
58         positon_of_star = (33, positon_of_star[1]+55)   #坐标下移到下一个星星处
59         if color[2] != 34:          #只比较第三个元素
60             count += 1              #不是暗的,说明星星是有效的
61     return count
62
63
64 if __name__ == ‘__main__‘:
65     for dirpath, dirnames, filenames in os.walk(os.getcwd()):
66         for dirname in dirnames:
67     ##        path = dirpath + dirname
68             image_processing(dirpath, dirname)

运行结果



运行前准备好,文件夹下放着待处理的截图:

脚本执行后得到我们想要的结果:

从上面的结果可以看出,脚本还是存在一些问题的:1,用于比对颜色属性(右下角)的值定的太死,有的像素点RGB值差了一点,结果就不能识别了,上文我提到过一次;2.对于不确定截图统一命名是名字-new导致覆盖问题。

我还专门做了动态图片:

Pythonner 的解决办法



我不是Pythonner,我不知道Pythonner is how thinking

不过我知道怎样就简单,就是什么都不做,不去 care 那些黑边,呵呵。

最后



末了发一下桌面,听说下雨天 PyCharm 和 LoveLive! 更配哦!

不要再往下看了,妹子在上面(不明白不理解日本人发明了emoji,却迟迟不包含 LoveLive! 的手势)

时间: 2024-10-09 13:45:19

[ller必读] LoveLive! 必备技能之 Python Pillow 自动处理截图的相关文章

前端工程师必备技能汇总

首先,看一张前端知识结构图:  (原文: ithomer) 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有些技术点会发生改变,所以有了这个GitHub项目.我们可以通过协作的方式来共同维护这个项目.Git的历史记录也可以见证前端行业的一些变迁. 尽管会变成文字的方式来维护这些内容,但是我承诺写一个小工具帮大家生成更好玩的图形(基于DataV项目). 前端开发知识结构 前端工程师 浏览器 IE6/7/8/9/10/11 (Trident) Firefox (

CSDN日报20170511 ——《开发人员的必备技能》

[程序人生]开发人员的必备技能 作者:葡萄城控件技术团队 对于刚开始学习软件开发的新人来说,"必备技能"往往意味着一个长长的.标有重要度的学习列表,但是过长的列表通常会导致新人不知如何开始学习,压力倍增. 本文尝试列举出最重要的几个技能,也期望通过此列表能给新人一个比较明确的学习重点和路径. 点击阅读全文 [物联网]JavaScript -- 下一代物联网全栈开发 作者:CSDN物联网开发 当下这个物联网大热的时代,JavaScript 支持 HTTP 和 JSON.支持函数式编程.可

正确地使用搜索引擎是学习编程的必备技能

作者:Crossin链接:http://www.zhihu.com/question/28017993/answer/83821668来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 如果你是一个刚刚成为或者想要成为程序员的人,首先你应当认识到: 正确地使用搜索引擎是学习编程的必备技能 一些搜索引擎使用技巧和意识: 用 google 作为你的默认搜索引擎 google 是目前这个星球上最好用的搜索引擎,没有之一.按理说,在开放的互联网上,有一个最好用的产品,你没有理

详解linux运维工程师入门级必备技能

详解linux运维工程师入门级必备技能 | 浏览:659 | 更新:2013-12-24 23:23 | 标签:linux it自动化运维就是要很方便的运用各种工具进行管理维护,有效的实施服务器保护 linux运维人员常用工具介绍 1.很多地方经常会用到的rsync工具 实施几台服务器的同步效果 我们公司就是使用这个工具完成服务器的游戏的服务端和客户端同步,有几个文章例子 rsync 强化技术(手动修改端口开启防火墙的情况下)并且通过脚本只同步需要的服务器 inotify+rsync+mutt+

【转载】运维职业向!我是怎么入得运维行业?运维工程师入门必备技能以及打怪升级篇

前言:转载 陈浩一个从事安全运维向的前辈文章.写的很好.人非常nice,遇到了问题,qq上很快就回复了我. 大道三千 入门最难,凡事入了行,也就什么都好说了,好的自然不断努力奋斗修行,不好的自然很快就被淘汰.恭谨勤勉,时不我待~ ---------------------------------------------------------------------------------------------------------------------------------------

Git算不算程序员的必备技能?

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书. --异步小编 Git的背后有着一个非常精彩的成功故事.2005年4月,Linus Torvalds因不满当时任何一个可用的开源版本控制系统,就亲自着手实现了Git. 时至今日,如果我们在Google中搜索"git version control"这几个关键词,都会看到数以百万计的返回结果.Git已经俨然成为了新型开源项目的一个标准.许多大型的开源项目都已经或正在计划迁移到G

大数据时代,就业转型必备技能!

转型大数据适合的人群 1.Java Java编程是大数据开发的基础,大数据中很多技术都是使用Java编写的,如Hadoop.Spark.mapreduce等,因此,想要学好大数据,Java编程是必备技能! 2.Python Python往往在大数据处理框架中得到支持. 3.Linux运维 企业大数据开发往往是在Linux操作系统下完成的,因此,想从事大数据相关工作,需要掌握Linux系统操作方法和相关命令. 在这里还是要推荐下我自己建的大数据学习交流群:529867072,群里都是学大数据开发的

财务必备技能 如何将pdf转换成excel

虽然pdf文件有各种的优点,但是编辑权限也是事实,将pdf转换成其他格式文件是不可避免的,之前小编给大家讲解过很多使用迅捷pdf转换器将pdf转换成word或是word转换成pdf的方法.今天就不局限于pdf和word的转换了,这里给大家一个新的转换形式,那就是pdf表格文件转换成excel,这可是财务必备技能之一,不会这种转换怎么看怎么亏. 如何将pdf转换成excel,pdf转excel操作步骤详解: 1.在迅捷pdf转换器的界面当中选择"文件转excel",之前我们在很多的文章中

mysql的介绍;安装及基本配置;mysql数据库运行必备技能

一.MySQL的介绍 1. 数据库:数据库集中存放位置 1) 常见的数据库类型:关系型(mysql.oracle.SQLserver2008,DB2),树型(windows注册表).非关系型(NoSQL). 2) 关系型数据库对象:数据记录-存->表à存à数据库:表分为数据库,关系表 2. MySQL是开源的关系型数据软件,目前由oracle公司维护,特点是:多线程.多用户.基于C/S架构(客户端/服务器),简单易用.查询速度快,安全可靠. 二.安装及基本配置: 1. 安装 1) 安装依赖ncu