Python之利用PIL批量给图片添加文字
因为略懂Photoshop,所以接到一个任务:将公司所有的产品图片整理出来,并在图片中写明产品的品牌和型号,然后分类放在iPad中方便给客户展示。
WTF,几千张图片,用PS一个个打开添加文字,这会把人弄疯的,作为一个懒人,做这种大量机械性的重复工作显然不是我的追求,于是就想到用程序自动实现。
一、使用Python和PIL图片处理库
思路:所有图片的文件名都是以品牌+型号的方式命名,所以先用python读取当前目录下所有文件,得到文件名后我们就可以得到当前图片的品牌型号字符串,然后根据图片像素大小自动判断合适的字体大小,再利用PIL库给原图片加上文字水印(品牌型号),然后将处理后的图片保存在当前目录下的new
子文件夹。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #!/usr/bin/env python3 # -*- coding:utf-8 -*- import os import sys import PIL from PIL import Image from PIL import ImageDraw from PIL import ImageFont # 设置文字水印 def set_water_text(imagefile, text): img = Image. open (imagefile) (img_x, img_y) = img.size # 文字字体像素高度为图片高度的 1/20 ttfont = ImageFont.truetype( '/usr/share/fonts/noto/NotoSansCJK-Regular.ttc' , int (img_y / 20 )) draw = ImageDraw.Draw(img) draw.text(( int (img_x / 20 ), img_y - int ((img_y * 1.3 ) / 20 )), text, ( 0 , 0 , 0 ), font = ttfont) newdir = "new" if not os.path.exists(newdir): os.mkdir(newdir) img.save(newdir + '/' + text + '.jpg' , 'jpeg' ) if __name__ = = '__main__' : files = os.listdir(os.getcwd()) for filename in files: if 'jpg' = = filename.split( '.' )[ - 1 ].lower() or 'png' = = filename.split( '.' )[ - 1 ].lower(): set_water_text(filename, filename.split( '.' )[ 0 ]) print (filename) |
二、使用效果
先使用两张照片样例测试,图片缩略图和文件名如下:
我的python代码保存的文件名为setwater.py
,在图片所在的目录下执行setwater.py
,然后程序会在当前目录下创建一个名称为new
的文件夹,然后将加了文字的图片保存在new
文件夹中。
添加文字后图片预览效果如下:
再分别贴出处理前后的照片图片
处理前:
处理后:
PS:文字具体颜色和位置字体等可以根据开发文档自行调整。
除非注明,戊辰人博客文章均为原创,转载请以链接形式标明本文地址