下午在玩儿狼人杀,作为萌新,每个汉字都听得懂,但是连在一起真的不知道是什么意思,而且各位大神刻意不搞我,穷极无聊之下只好把之前的文章写完。不过狼人杀这东东好烧脑,完全没有搞懂逻辑在哪里啊。
图片处理
处理档案图片中,最核心的操作就是把图片从原来的大图裁剪为小图,裁剪图片需要用的第三方库为pillow
库,安装方法如下:
pip install pillow
像pillow这种非常程序的库,在readthedocs
上https://pillow.readthedocs.io/ 有详细的文档的,python的第三方库实在是太多了,所以学会看文档是非常重要的。
打开图片
我们先来完成最核心的内容,完成图片的裁剪。首先我们如何用pillow打开并显示图片,注意Python文件main.py
是跟我所有的图片是在同一个文件夹下的:
明白文件结构有助于加载图片。
from PIL import Image
# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
img.show()
运行程序,会弹出一个窗口显示图片,我们先从PIL中导入Image模块,然后调用Images模块中的open
方法打开图片以便于进行后面的操作,open
方法的参数就是图片的路径,当然这里只是告诉大家如何用pillow
库加载图片,真正处理的时候不需要调用show
方法显示图片。
我们要裁剪图片,就需要知道图片原来的图片:
from PIL import Image
# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
w, h = img.size
print(w, h)
运行程序,输出结果如下:
D:\coding\docs\images>python main.py
3696 2448
我们调用open
方法打开图片,得到图片对象,图片对象有一个size属性,以元组
的形式保存了图片的尺寸,第5行w, h = img.size
这种写法是Python对于多个元素复制的方法,img.size
指为(3696, 2448)
,用这种方法可以分别给w
和h
复制,分别代表图片的宽和高,我们用print语句打印w和h也证明了这一点。
裁剪图片
pillow
库实在是太强大了,对于常见的图片操作都提供了相应的方法,我们可用thumbnail
方法用来得到图片的缩略图,我们用Python的内置函数help
来看下thumbnail
方法是怎么用的:
from PIL import Image
# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
w, h = img.size
print(help(img.thumbnail))
open方法返回的图片对象有一个thumbnail
方法得到图片的缩略图,我们用help方法也可以很清晰的看到thumbnail
方法的用法,第1个参数是缩略图的尺寸,也是个元组,类似于坐标的数对。
其实吧,在交互式命令行摸索pillow
库的使用也是非常方便的,感兴趣的可以自己尝试,我们把图片的宽和高都变为原来的一半,为了简单起见,我们把裁剪后的图片放到当前目录,并且给图片文件名加一个thumbnail:
from PIL import Image
# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
w, h = img.size
img.thumbnail((w//2, h//2))
img.save('thumbnail_LXM_0216.JPG')
我们把宽度和高度都重新设置为原来的一半,并且调用img对象的save方法保存裁剪后的图片,文件名加一个thumbnail
前缀,运行程序,看下保存所有图片的文件夹:
然后我们就可以根据文件名排序,然后挑出所有的缩略图。
看下图片的属性:
然后看详细信息:
注意图片尺寸的变化,除了尺寸的变化,其实水平和垂直分辨率也发生了变化,这个跟thumbnail方法的第2个参数有关系:
第2个参数决定了生成缩略图是如何重新对图片取样的。
兄台可能觉得,这很不自动化啊,充其量是半自动啊,但是饭要一口一口的吃啊,我们先完成最核心的功能,然后逐步迭代优化,直到完全满足我们的需求,实现全部的自动化,因为最开始的时候,我们只需要一个能够工作,提高我们工作效率,帮我们完成80%的重复性工作就好了,因为如果你要实现全部的自动化的话,可能需要耗费你80%的时间,开始的时候没有必要花80%的时间完成20%的功能的,我们要用20%的时间完成80%的功能的。我喜欢的是linux的软件设计哲学,瑞士军刀,小而巧,用各种小工具帮助我们完成任务,我们不需要vs studio这样的巨无霸*。
我们已经实现了加载图片,裁剪并另存缩略图了,接下来,我们只需要用上节课讲的知识点,遍历所有图片并且得到缩略图就可以了。
遍历所有图片
from PIL import Image
import os # 导入os模块
# 加载图片,注意路径
# img = Image.open('LXM_0216.JPG')
# w, h = img.size
# img.thumbnail((w//2, h//2))
# img.save('thumbnail_LXM_0216.JPG')
# 利用os模块的listdir方法得到当前文件夹
# 下所欲的图片
for file in os.listdir():
# file代表是当前文件夹下
# 的文件名,listdir得到的是
# 包含当前文件夹所有文件文件名的
# 列表
img = Image.open(file)
w, h = img.size
img.thumbnail((w//2, h//2))
img.save('thumbnail_' + file)
大家注意到我的注释,如果代码不熟悉的情况下,可以把处理单张图片的代码注释掉,然后写for循环,for循环内部是处理单张图片的代码,所以我们就比照着前面的代码,写出处理每张图片的代码。
运行代码,查看代码的运行结果:
woao,好酷啊可以看到,生成了所有图片的缩略图。
小结
本文带领大家用pillow
库处理图片并得到缩略图,然后用os模块的listdir
方法得到当前文件夹下所有的图片并处理所有的图片。
问题
D:\coding\docs\images>python main.py
Traceback (most recent call last):
File "main.py", line 9, in
img = Image.open(file)
File "C:\Users\xpro\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py", line 2687, in open
% (filename if filename else fp))
OSError: cannot identify image file 'main.py'
代码报错,不能确定图片文件main.py,所以我们在处理图片的时候要加一个判断,判断文件是不是图片,我们只需要判断文件的后缀是不是JPG就可以了:
from PIL import Image
import os # 导入os模块
for file in os.listdir():
if file.endswith('JPG'):
img = Image.open(file)
w, h = img.size
img.thumbnail((w//2, h//2))
img.save('thumbnail_' + file)
字符串的endswith
方法是用于判断字符串是不是以某个字符串结尾,这里我们判断代表文件名的遍历file是不是以JPG结尾,用来判断listdir
方法返回的包含所有文件名的列表中,每个文件名是不是JPG,也就是文件名代表的文件是不是图片,我们只处理图片文件,注意,这样还是有些问题的,希望有人看到,并求留言谢谢。
如果觉得文章还不错,点个好看,如果觉得真的很不错,麻烦转发下,如果觉得真的是太棒了,请转发到群(这么好的文章难道要我自己转发吗,不应该赶快让你们的朋友看到吗)谢谢。
PS:看他们玩儿狼人杀,感受到智商的碾压,感觉自己像是个傻子。。。真的是玩儿到大脑缺氧,每个人发言都好长啊
双PS:大神说,狼人杀是个会议游戏,你要去说服别人,然后提醒萌新,如果在职场balabala。。。。。。,好可怕的大神,真是非常激烈的游戏了。
叒PS:之前github的使用,只有东营的胡莹老师完成了: