使用Python批量处理图片

最近处理一些规格不一的照片,需要修改成指定尺寸便于打印。为便于分类排列,还需要能够在照片上显示日期信息。如果只是单独几张照片,完全可以使用Photoshop解决。然而面对成百上千张的照片,照片的日期信息也不尽相同,Photoshop便显得难以胜任了。

考虑到修改图片尺寸也好,添加日期文本到图片上也好,这些对图片的修改任务都是程序式的,完成一次和完成一百次在步骤上并没有什么变化,因此编写脚本程序进行处理无疑是一劳永逸。而Python的标准库以及图像处理库Pillow恰能完美完成本项任务。

这里选择十张大小不一的图片,使用Python+Pillow对整个图片批处理过程进行模拟。主要流程是编写两个方法,一个用于修改尺寸,一个用于为图片添加日期信息,最后在每张图片上都分别应用这两个方法,达到批处理的目的。

1.素材准备

因为要处理大量图片,首要任务是收集待处理图片。对于相机拍摄的照片,可以直接使用原图,这样做有两个优点:一是保证图片在尺寸修改之前不会有画质损失;二是原始图片中包含很多有用的信息,比如有规则的文件名,拍摄时间等,这在本文的为图片添加文本信息部分会详细介绍。

用于本文模拟的图片素材下载自网络,并不包含类似于照片的拍摄信息。不过因为对照片处理的任务只需要使用照片的拍摄日期信息,而恰好日期信息在照片文件名中有所体现,所以完全可以把素材图片文件名修改为和待处理照片相似的格式。待处理照片的文件名格式为“IMG_(datetime)xxxxx”,有用的部信息为“_”之后的拍摄日期。将模拟素材照稍加处理之后,得如下图所示的一些文件:

使用Python批量处理图片

修改文件名后的图片素材及文件信息

这些素材经微信转发一次,文件名会被修改成固定的格式,再将日期信息稍加修改即得到我们期望的素材。此外,我们也能看到图片的分辨率信息,这些图片的长宽比都不一致,一般来说相机拍摄照片的长宽比更为固定,不过使用这些尺寸变化较大的素材,更能体现出使用代码进行图片处理在应对不同尺寸素材时的灵活性。现在已经得到了模拟处理过程所需的全部素材,接下来便可以逐步对素材进行处理。

2.修改图片尺寸

任何一个图像处理库都会包含一些最基本图像处理操作,其中最常用的为仿射变换,包括旋转,平移,缩放,剪切等。修改一张图片至目标尺寸,缩放与剪切正是我们所需要的。为保持图片的原始比例,并不能够直接将图片变换到目标尺寸,需要在等比例缩放后对图片进行一些修剪。所以我们只需要在图像处理库中找到缩放和修剪图片相关的方法,再进一步代码实现缩放和修剪过程即可。

Pillow是Python中最为流行的图像处理库,支持一系列的图形处理功能。我们使用Pillow完成图片尺寸修剪的需求。查阅Pillow库文档,可以在Image模组中找到名为resize的方法,使用这个方法可以调整一张图片的尺寸,最巧妙的是可以在调整尺寸后输出指定区域,因此在参数设置合理的情况下,只需要这一个方法就能够完成我们的全部需求。下面用一张图描绘resize方法重定义图像尺寸的等效的过程:

使用Python批量处理图片

重定义图片尺寸过程可视化模拟图

图中所有非红色蒙版区域尺寸均等于目标尺寸。resize方法对图片尺寸调整的效果相当于流程(1)→(3)→(4)。(1)中目标尺寸大于素材尺寸,所以将素材等比例放大至与目标尺寸等高,再与目标尺寸中心对齐后修建去目标尺寸之外的像素,便得到我们所需要图片。(2)中描绘素材缩放后与目标尺寸左对齐的效果,如果在此基础上修剪冗余部分,图像信息损失会集中在右侧,为使修改后图片相对均衡,本次批处理使用中心对齐并修剪的方案。

需要注意,缩放过程中素材与目标尺寸等高或者等宽,可以保证图片在缩放和剪切后损失最少的信息。至于缩放至等长还是等宽的选择取决于素材尺寸与目标尺寸的相对长宽比,例如目标尺寸相对素材尺寸较宽时--上图对resize方法效果的模拟情况下--需要缩放至等宽,如果缩放至等长,显然目标尺寸中会有部分区域未被填充,我们并不希望获得一张包含过多空白区域的图片。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzjpy.html