碎碎念(可跳过):上学期末大学的部门生活正式结束了,因为疫情原因,部门的聘书只能以电子版的形式发给大家,宣传部的同学需要在聘书的模板上一张张用photoshop填上几十号人的名字,调字体,调位置,调颜色什么的想想工作量就很大,而且容易出错。这学期刚装好了opencv库,就想着可以写代码用python+opencv一键生成所有人的聘书,ps制作的聘书已经拿到了,但是在网上搜索了一下,没有相关的博客,就自己写一篇吧,也许能帮助到未来其他宣传部的朋友。
首先导入需要的module
import cv2
from PIL import Image, ImageFont, ImageDraw
import numpy as np
import csv
#读入模板图片
img1 = cv2.imread('F:/batch_letter/template.jpg', cv2.IMREAD_COLOR)
#字体、颜色、填入字符串左上角的像素位置
font = ImageFont.truetype('C:/Windows/Fonts/simhei.ttf', 15)
color = (40, 77, 184)
pos0 = (278, 257)#填写部门的位置
pos1 = (84, 233)#填写姓名的位置
字体这里我用了电脑自带的黑体字,也可以选用其他的,打开C盘下的windows,在windows文件夹中,随便单击一个文件夹,选中后,按F,则可以快速找到fonts字体文件夹
我们的聘书中一共两个空要填,在ps中打开信息面板可以通过跟随鼠标确定像素点的位置和颜色信息
因为这里只是做演示,成员名单就瞎弄了一下,一般的话组织都会有通讯录,真正做的时候根据通讯录的名单调整就可以了
接着用csv库导入这两列
with open('F:/batch_letter/成员名单.csv')as f:
f_csv = csv.reader(f)
column0 = [row[0] for row in f_csv]
print(column0)
with open('F:/batch_letter/成员名单.csv')as f:
f_csv = csv.reader(f)
column1 = [row[1] for row in f_csv]
print(column1)
最后一个循环写入就好啦~
for i in range(len(column0)):
# opencv对象转PIL对象,将opencv的BGR通道转成RGB通道
pil_image = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
text0 = column0[i]
draw = ImageDraw.Draw(pil_image)
draw.text(pos0, text0, font=font, fill=color)
text1 = column1[i]
draw = ImageDraw.Draw(pil_image)
draw.text(pos1, text1, font=font, fill=color)
# PIL对象转opencv对象,将PIL的RGB通道转成BGR通道
final_img = cv2.cvtColor(np.asarray(pil_image), cv2.COLOR_RGB2BGR)
#写入指定文件夹
cv2.imwrite('F:/batch_letter/pinshu/' + str(i) + '.jpg', final_img)
本来想文件名用姓名来命名的,后来发现cv2.imwrite()中的路径不能带中文,那就数字编号吧,到时候每个成员在表格里自己对照着号码找也挺方便的
这是单张图的效果
参考文章:
https://www.codercto.com/a/77018.html Python+OpenCV 为图片添加中文水印与图片水印
https://blog.csdn.net/hengwen1991/article/details/52291119 Python 读取csv的某列
https://blog.csdn.net/xiaocao9903/article/details/53008613photoshop 获取像素坐标
最后,也是现学现做,如果有什么错误或者可以改进的地方欢迎讨论。