碎碎念(可跳过):上学期末大学的部门生活正式结束了,因为疫情原因,部门的聘书只能以电子版的形式发给大家,宣传部的同学需要在聘书的模板上一张张用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字体文件夹

python生成模型pth_opencv


我们的聘书中一共两个空要填,在ps中打开信息面板可以通过跟随鼠标确定像素点的位置和颜色信息因为这里只是做演示,成员名单就瞎弄了一下,一般的话组织都会有通讯录,真正做的时候根据通讯录的名单调整就可以了

python生成模型pth_opencv_02


接着用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)

打印结果

python生成模型pth_csv_03

最后一个循环写入就好啦~

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()中的路径不能带中文,那就数字编号吧,到时候每个成员在表格里自己对照着号码找也挺方便的

python生成模型pth_python生成模型pth_04


python生成模型pth_python生成模型pth_05


这是单张图的效果

参考文章: 为图片添加中文水印与图片水印
Python 读取csv的某列
获取像素坐标

最后,也是现学现做,如果有什么错误或者可以改进的地方欢迎讨论。