Python日课-3.2-定义函数与 pillow 图像处理
Python 日课 2021-01-19:定义函数与 pillow 图像处理。
各位 Python 同学大家好啊,今天的课程来啦。
在昨天的 Python日课-3.1-Pillow滤镜初识 中,我们学习了 Pillow 高斯模糊和模式滤镜的使用。今天我们继续讲 Pillow,同时学习一下拆分字符串、定义函数。
我们经常需要对图像进行旋转和放大缩小的操作,这可以使用 Pillow 中的 resize 和 rotate 方法来进行。
resize 文档: https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.resize
rotate 文档: https://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.rotate
在昨天的课程中,我们直接提供了要被处理的图像文件名,以及处理后的图像文件应该存放的文件名。
但在实际的工作中,我们往往需要指定不同的文件名,获取文件名是一个会被多次调用的重复操作。在编程世界中,我们一般将重复的操作定义成一个函数。
下面就是这个函数的内容:
1def get_file(name, suffix):
2 """ 返回 assets 文件夹下的原始文件和目标文件
3
4 :param name: 原始文件名
5 :param suffix: 需要被增加到目标文件名中的后缀
6 :returns: 原始文件,目标文件
7 """
8
9 sfile = basedir.joinpath('assets', name)
10 # 假设 name 的值为 '前台.jpg' ,我们需要分别得到 '前台' 和 'jpg' 两个字符串,此时需要使用 split 方法,基于英文句号将字符串拆成两个
11 # sfile.name.split('.') 会返回一个 list,包含两个字符串。fname 和 fext 中分别包含 '前台' 和 'jpg' 这两个值
12 fname, fext = sfile.name.split('.')
13
14 # 使用 f 开头的字符串支持替换,下面的 suffix 等花括号中的变量会自动被替换为变量中的值
15 # 假设 suffix 的值为 'rotate90',那么 tfilename 的值为 '前台_rotate90.jpg'
16 tfilename = f'{fname}_{suffix}.{fext}'
17 tfile = basedir.joinpath('assets', tfilename)
18
19 # 返回原始文件和目标文件
20 return sfile, tfile
这里出现了一些新的东西,我来介绍下。
def
是 python 中定义函数的语句。一个函数包含名称、参数和返回值。
get_file
是这个函数的名称。这个函数支持两个参数 name
和 suffix
,包含在函数名称后面的括号中,最后需要用一个英文冒号声明函数体的内容。
下面包含在三个双引号之间的内容叫做 DocString ,你可以把它理解成一种注释,用来说明这个函数怎么运作。
这个函数要做的事情,就是通过提供的 name 参数,以及 suffix 参数,返回两个文件,前面一个文件是原始文件,后面一个文件是目标文件。
通过这个函数,我们只需要提供一个原始文件名,就能直接生成目标文件,在使用的时候会方便不少了。
具体的实现,大家可以看其中的注释内容,已经很详细啦,不明白的同学,可以直接在群里提问。
下面我们要来使用 get_file
这个函数。
1def rotate(source_name, angle):
2 """ 旋转 source 图像文件到 angle 角度,并保存到新文件
3
4 :param source_name: 原始文件名
5 :param angle: 浮点数,旋转的角度。90 代表顺时针旋转 90 度
6 """
7 # 获得原始文件和目标文件,其中 f 字符串的用法在 get_file 中介绍了
8 sfile, tfile = get_file(source_name, f'rotate{angle}')
9
10 simg = Image.open(sfile)
11 timg = simg.rotate(angle)
12 timg.save(tfile)
我们定义了另一个函数 rotate
。rotate 函数提供旋转一张图片的功能,里面的代码没有新知识,在上节课都已经介绍了。唯一的区别就是在 rotate
函数中调用 get_file
来获取原始文件和目标文件。
除了 rotate
功能外,我们还做了一个 scale
函数,用来缩小或者放大图像。
1def scale(source_name, ratio):
2 """ 改变 source 图像大小,使用 ratio 作为比例,保存到新文件
3
4 :param source_name: 原始文件名
5 :param ratio: 浮点数,代表调整的比例。 0.5 代表调整为原始大小的 50%
6 """
7
8 # 获得原始文件和目标文件,其中 f 字符串的用法在 get_file 中介绍了
9 sfile, tfile = get_file(source_name, f'rotate{ratio}')
10
11 simg = Image.open(sfile)
12
13 # 获取图像调整后的大小,使用 int 来将浮点数转换成整数
14 width = int(simg.width * ratio)
15 height = int(simg.height * ratio)
16
17 # (width, height) 是一个参数,同时提供两个值
18 timg = simg.resize((width, height))
19 timg.save(tfile)
接下来,我们可以调用 rotate 和 scale 函数,看看效果如何:
1# 把 前台.jpg 这个文件旋转 90 度
2rotate('前台.jpg', 90)
3
4# 把 前台.jpg 这个文件缩小 50%
5scale('前台.jpg', 0.5)
6
7# 把 餐厅.jpg 这个文件旋转 180 度
8rotate('餐厅.jpg', 180)
上面所有的内容保存为 pillow3.py,调用它:
1python pillow3.py
今天的课程就到这里啦,欢迎大家到群里讨论。
下载源码附件:
- 文章ID:2744
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/python-daily-pillow2/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。