【Python教程】使用pillow模块做个照片墙

图片
大家好,欢迎收看思路实验室出品的Python入门教程,我是室长。
在这一期中,我们初步地了解了pillow模块,并了解了它的滤镜功能。但这些只是pillow模块的很小一部分功能,它还可以实现图像调整大小、剪切、粘贴等操作。今天我们就通过制作照片墙这样一个小案例来学习如何使用pillow模块进行图像的尺寸调整以及剪切粘贴。
因为使用正方形的图片来制作照片墙最为合适,而我们通常的照片都不是正方形,所以室长从网上获取了一些微信头像来进行展示。
室长一共获取了360张头像,我们可以把它做成一个24×15的照片墙。那么首先我们需要准备一个空白的画布。24×15的照片墙,长宽比为8:5。将其调整成合适的像素数,可以调整为1440:900。我们可以使用Image子模块的new方法来生成一个新的图片。new方法的第一个参数是色彩模式,常用的就是RGB以及RGBA(带有透明度信息);第二个参数就是尺寸,我们可以传入一个元组,这里就是(1440,900);第三个参数是颜色,新建的图片都是单色图片,默认为黑色,我们也可以传入色彩模式相应的颜色元组或代码:
图片
有了画布的尺寸,我们就可以计算每个头像的尺寸了。既然画布是按照24×15个头像设计的,尺寸为1440:900像素,那么计算后每个头像的尺寸应为60×60。而室长获取的头像尺寸是多少呢?我们访问一下图片的size属性来看看:
图片
是400:400像素,这对于我们的画布来说太大了,根本放不下几张头像。所以我们需要将头像压缩成60:60像素,才能进行粘贴。这里我们使用resize方法
图片
虽然resize方法的使用非常直观,但这里还是有些门道的。除了尺寸信息之外,resize方法还有三个参数。
一个是resample参数,它确定着放大或缩小图片采用的重采样方法。对于缩小图片操作来说,它相当于从一堆像素里挑出一些像素保留,而对于放大图片操作来说,它相当于在不同像素之间添加一些像素。如何挑选,如何添加,必然会影响缩放后图片的效果。所以选择合适的重采样方式有助于生成理想的图片。这个参数可选值为Image子模块下的滤波器,如Image.NEAREST(低质量)、Image.BILINEAR(双线性)、Image.BICUBIC(三次样条插值)、Image.ANTIALIAS(高质量),默认为Image.BICUBIC。
一个是box参数,它确定放大图片中的哪部分。它更像是将裁剪与缩放进行结合,使用一个方法完成两步操作。box参数接收四个元素的元组,四个元素分别为左、上、右、下的像素序数。
还有一个是reducing_gap参数,它用来对缩放图像进行优化,常用的取值为3.0和5.0。
此外resize方法返回的是一个新的图像,而非在原图像上进行更改,千万要记得将返回值存入变量。
头像缩放好了,接下来就应该将它粘贴到画布上了。我们使用paste方法就可以轻松实现图像的粘贴:
图片
图片
使用paste方法有一些要点也是要注意的。首先我们需要对被粘贴图像的图像(也就是画布)调用paste方法。其次paste方法有三个参数,第一个就是粘贴的图像,第二个是box参数,和resize里的box参数一样,第三个参数是可选参数mask,它可以为粘贴的图像添加蒙版效果。特别需要注意的是box参数,它计算后的尺寸需要和粘贴的图像的尺寸完全一致,差一点都会报错,而且通过box来计算尺寸的公式是右-左,下-上,而不+1,也就是说,例子里的box虽然写的是(0,0,60,60),但实际的粘贴区域是(0,0,59,59)。这有点像range函数,右边界的数值不会产生。最后,paste方法会对被粘贴图像进行修改。
现在最困难的步骤我们已经成功了,剩下的就是重复劳动了,我们直接写两个for循环就能够实现照片墙的生成。我们依然使用os模块的listdir方法来获取头像文件的列表,在for循环过程中我们需要注意对box的设置。此外别忘了使用save方法保存好我们的结果:
图片
有些同学可能会出现如下报错:
image file could not be identified because WEBP support not installed
这时候在命令行里输入:pip install —upgrade Pillow 就可以了。
图片
这样我们就非常轻松地实现了我们的目标。这一期我们学习了如何使用pillow模块创建图片、缩放图片以及粘贴图片。仅仅这三个最为基本的操作也展现出了强大的效果,在pillow模块中,一切变得如此简单。实际上,室长每次在文章开头展示的动态二维码,也是基于这个思路制作出来的。可见限制我们的往往不是技术而是想象力,用好python,用好pillow可以让你的想象快速地转变为可能。如果这篇文章对你有所帮助,希望能帮室长点个赞和在看,你的鼓励是室长进步的动力!
【室长原理课】系列在不正经地科普一些互联网小知识,没有太多高深的内容,把这个系列分享给你的朋友吧!
喜欢此内容的人还喜欢
左右滑动查看下一篇
图片