了解到resize方法实现的效果后,只需要为resize方法提供合适的参数,就可以将一张图片的尺寸灵活地调整到目标尺寸。这些参数的具体计算过程以及对resize方法的使用封装在文末程序代码的img_resize方法中,我们只需要提供修改图片的目标尺寸。
3.为图片添加文本信息为图片添加文本信息的过程比较简单,就是一个将大象装进冰箱的问题:①首先获取欲添加的文本信息 ②把文本添加到待处理图片上。
这里的待处理图片指的是尺寸调整之后达到需求尺寸的图片,只有在图片尺寸确定之后才能够在正确的位置添加文本信息。
在素材准备部分中将素材文件名修改为规则的带有日期信息的格式正是为了方便地获取①步骤中欲添加的日期文本,在实际的批处理中照片文件名也是这种带有日期信息的规则格式。观察文件名,可以发现日期信息从“_”之后开始,由8位数字组成,使用正则表达式可以直接提取这个字符串,再将年、月、日拆分,转换到常用日期格式,便得到待添加的文本。
把文本添加到图片上的操作在常用的办公软件上相当简单,可以直接添加文本框。不过在代码层面上这个操作要复杂一些,在获取文本后还需要将其与待处理图片混合,输出一张完整的图片。在数字图像中,可以将图像分为四个通道:RGBA。RGB三个通道包含图片基本的颜色信息,而A(α)通道携带的则是图片的透明度信息,决定一张图片的透明程度。在图片上添加文本的原理类似于将带有文字的“贴纸”贴在待处理图片上,这张“贴纸”实际上就是一张图片,图片中除文本部分外α通道为全透明,在设置“贴纸”上的文字与文字位置信息后,将“贴纸”与素材图片的α通道混合得到一张新的图片,就实现了图片上文本信息的添加。
使用Pillow库进行代码实现流程与上述基本一致:①创建一张与待处理图片尺寸一致的空图片 ②在这张空图片合适的位置上绘制文本,使用ImageDraw.text方法,该方法可以直接得到一张“贴纸”形式的图片 ③使用 Image.alpha_composite方法混合“贴纸”与待处理图片的α通道,得到我们所需要的图片。
到这里我们已经获得了所需要的一张图片,下一步的批处理步骤则不断重复修改图片尺寸和为图片添加文本信息这两个过程,大大提高了处理图片的效率。
4.批量处理使用python标准库的os模块,可以方便地获取文件夹中的文件路径,这是我们得以对图片进行批处理的基础:在获取素材图片路径中图片的文件名后,一方面可以对路径下的每张图片进行尺寸修改,另一方面在通过文件名解析日期信息,便可以为图片添加文本。
既是批处理过程,首先需要得知的是需要处理那些素材,我们可以将遍历图片路径得到的文件名储存到一个列表中,再对这些图片进行统一的处理。在具体的代码实现中,获取文件名的过程可以和解析日期的过程同时进行,我们将获得两组信息,一组是文件名,另一组是文件名中包含的日期信息,这两组信息是一一对应的,可以创建一个字典保存这些信息。代码中通过get_pathtime_dict这个方法实现。
余下的操作就比较清晰了,只需要将上述步骤整合起来,便可完成我们的图片批处理过程:获取待处理的文件名及日期信息字典,遍历这个字典,通过文件名找到图片并修改尺寸,而后将日期信息添加到重定尺寸后的图片上,最后把处理后的图片导出。批量处理后的单张图片效果与批处理后的新图片的文件信息如下:
单张素材原图(左)&处理后的效果图(右) 素材批处理后的文件信息从两张图中可以看出,日期信息被成功地添加到素材图片当中;而经过批处理后的图片在尺寸上已经完全一致,并且保持了素材图片的矩形较长边的方向。处理前后图片的文件格式由jpg转换为了png,这是由于在添加文本的过程中涉及到α混合,图片保存有α通道信息,可以直接储存为png格式,jpg格式则不包含α通道信息,所以欲保存为jpg格式还需要进一步转换。因为两种图片格式都非常常用,能够适用于各种场景,也就没有将png格式再刻意地转换回jpg格式。
5.总结使用上述方法对图片进行批量处理,修改一张图片只需要不到一秒钟的时间,这种效率是使用Photoshop等软件无法企及的。此外使用代码进行图片批处理还极具灵活性,如果需要修改图片至不同的尺寸、添加外的信息等,只需简单地修改几处参数。