Python日课-3.2-定义函数与 pillow 图像处理

Python 日课 2021-01-19:定义函数与 pillow 图像处理。

曾老师的 Python 课 第一课的所有内容已经全部发布,包括课程 PPT、课程视频都可以免费获取,可以使用微信扫描下面的二维码进群获取。

请进群索取课程 PPT 以及视频播放地址

这套课程有两条教学线:

  1. 现场教学,约两周一次,每次一小时,主要为实际案例的讲解。
  2. 微信群教学,每日一次,由易到难讲解 Python 知识点,Python 相关的小故事,业界八卦,IT 行业最新信息。

各位 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 是这个函数的名称。这个函数支持两个参数 namesuffix ,包含在函数名称后面的括号中,最后需要用一个英文冒号声明函数体的内容。

下面包含在三个双引号之间的内容叫做 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

生成的图像文件

今天的课程就到这里啦,欢迎大家到群里讨论。

下载源码附件:

1 文件
全文完