通过Python在健康码,行程卡的截图上添加文字内容,省心省力

最近几年,由于疫情的原因,学校经常要求家长,把健康码,通行卡等截图内容加上学生名字以及家长的名字或者电话号码后,发给学校;如此一来,就要重复的把同样的文字添加到不同日期的截图上去,如果是两个孩子,就要做两遍,会很不方便,也很浪费时间。

这种情况,如果交给Python,就变得非常简单,只要写几段代码就可以在1秒钟内完成这个操作,非常方便。更进一步来说,如果学校或者工作单位,一定要添加学生姓名和家长信息的健康码或者行程卡的图片,是否可以在收集到健康码和通行卡等所需要的图片后,通过程序来添加学生和家长的信息到图片中去,那将节省成千上万个学生家长的宝贵时间…

言归正传,本文将说明,如何通过Python将指定文件夹中,符合指定命名规则的图片添加上指定的文字内容,最后按指定的命名规则将添加文字后的图片保存到指定的文件夹中。以下代码仅是单个家庭为例,包含有多个孩子的信息的情况,文件目录主要以日期命名,各日期下存放学生及学生家长的健康码及行程卡截图文件,只需要对图片的文件名进行简单的设定,就可以通过程序自动添加所需要的文字内容,图片名称的命名规则如下:

比如,图片名的首字符如果是:
1 开头的为孩子的健康码,如果有多个孩子,可以用11,12,13,进行区分;
2 开头的为孩子爸爸的健康码和行程卡
3 开头的为孩子妈妈的健康码和行程卡
以此类批,详见代码中的注释

以下是全部的代码以及详细的注释说明:

"""
Title : Put Text To Screenshot
Author: Le Miaokai
Date  : 2022-10-19
LeMiaokai@Gmail.com
"""

"""# 第一步, 导入所需要模块"""
from ast import While
import os, sys, datetime
from PIL import Image, ImageDraw, ImageFont


"""# 第二步,设定一些基本参数,比如需要添加的文字内容,以及字体,字号和图片所在文件夹等内容"""
# 获取当前代码或可执行文件所在的目录    
curr_path = os.path.dirname(os.path.realpath(sys.argv[0])) 
# 新创建的文件名为Txt文件,保存到当前目录中,用于存放需要添加到图片中的文字内容,文本文件方便在程序外编辑修改
config_filename = curr_path + "/Text_Content.txt"   
     
# 判断当前目录下的文本文件是否已经存在 # 如果文件不存在,则创建新文件,如果存在则读取内容
isExists = os.path.isfile(config_filename)
# 判断结果
if not isExists:  #如果配置文件不存在,则创建配置文件
    config_file = open(config_filename, 'w', encoding='utf-8')
    config_file.write("""关于图片文件的名称说明:
图片文件名的第一位字符与下面各行的内容对应,比如:
1-开头的为孩子的健康码,如果有多个孩子,可以用11,12,13,进行区分;
2-开头为家长A的健康码和行程卡,
3-开头的为家长B的健康码和行程卡
以上是关于图片文件命名规则的说明,短横线以下的内容为需要添加到图片上的文字内容,如有多个孩子,则以 , 进行分隔, 比如:欢欢,笑笑。
----------------------------------------------------------------------------------------------------
""") 

    # 创建一个变量text用于存放文字内容,初始为 20个'-' 用于后续识别
    text = []
    text.append('-'*20)

    # 提示输入孩子信息:
    print("\n    >>> 请输入孩子姓名,如有多个孩子请以 ,分隔 \n")
    imput_text = input("    >>> ")
    # 将输入的内容,写入到文件中。
    config_file.write(imput_text + '\n')
    # 将输入的内容,保存到text列表中。
    text.append(imput_text)

    # 循环输入家长信息
    keep_input = True
    while keep_input :
        print("\n    >>> 请输入家长姓名:")
        imput_text = input("    >>> ")
        # 将输入的内容,写入到文件中。
        config_file.write('家长 ' + imput_text + '\n')

        # 将输入的内容,保存到text列表中。
        text.append('家长 ' + imput_text)

        # 提出是否还需要,输入更多信息,
        imput_text = input("    >>> 是否继续输入(y/n)")
        # 如果输入的内容是Y或者y,则继续循环
        if imput_text == "y" or imput_text == "Y":
            pass
        else:
            keep_input = False

    print('\n\n    >>> 配置文件已经创建完成。' +"\n    >>> "+ config_filename)
    #  文本文件创建后,关闭文件
    config_file.close()
else:
    # 如果文件存在,则以只读方式打开
    config_file = open(config_filename, 'r', encoding='utf-8') 
    # 读取文本文件中的全部内容
    text = config_file.readlines()
    #  文本内容读取后,关闭文件
    config_file.close()

# 读取文本中的内容,生成文本字典格式数据 text_content,格式如下详见上文说明。 
text_content = {}
# 新增一个变量,用于区分读取的内容是否属于需要添加到文本中的内容。
istext_content = False
# 新增加一个变量,用作编号代码,对应图片中的文件名
text_id = 0

# 循环读取文本中的全部内容,并将指定的需要添加到图片中的文字内容保存到文本字典中。
for i in range(len(text)):
    if istext_content:
        # 文本内容存放字典中的关键字,以1开始
        text_id += 1
        # 去除文本行中的换行符以及Tab符
        text_content[str(text_id)]=text[i].replace('\n','').replace('\t','')

        # 如果是孩子的信息,由于可能会有多个孩子,所以以列表的格式保存
        if text_id == 1 :
            # 去除该行中的空格,用半角逗号, 替换全角 ,这后再用半角逗号将字符串分割为列表。
            text_content[str(text_id)] = text_content[str(text_id)].strip().replace(',', ',').split(',')

    # 如果有20个以上的 '-'出现在某一行中,则下一次读取的内容便是需要添加的文本内容,作为识别定位。
    if "-"*20 in text[i]:
        istext_content = True

# 输入健康码和行程卡的截图,存放的目录,
while True :
    img_path = input("""
请输入「或拖入」图片所在文件夹:
>>> """)
    # 如果是小于5个字符的内容,设定为不符合要求,需要重新输入
    if len(img_path)>=5 : break  
    
# 去除目录中的 " 如果有的话。
img_path= img_path.strip('"')

# 设置修改后的图片尺寸,585,1266,是我手机屏幕的1/2, 你也可以根据实际情况进行调整。
size = (585,1266)

# 设置需要显示的字体
fontpath = "font/simsun.ttc"
fontStyle = ImageFont.truetype(fontpath, 35)


"""# 第三步, 读取文件夹中的图片,如果图片文件名的第一个字符在字典关键字中,则读取图片,并将字典中对应的文本添加到图片中,保存图片"""
# 循环添加每个孩子的信息, c_id 为编号,c_info 为每个孩子的信息
for c_id, c_info in enumerate(text_content["1"]):
    # 同一个家长的信息,要在图片上添加不同孩子的内容,所以需要根据孩子的数量,对当前文件夹内的图片进行重复处理。
    print('    >>> 当前进度:',c_id + 1, c_info)
    # 读取文件夹中的全部图片
    for img_name in os.listdir(img_path):
        # 提取文件名的首位字符,如果该字符存在于用于显示的字典关键字中,则处理,否则不作处理
        text_id = img_name[0:1]

        if text_id in text_content:
            # 获取当前处理的图片文件的完整路径,并读取图片
            curr_img = Image.open(os.path.join(img_path, img_name))
            # 将原图片的大小调整完成后,生成新的图像
            new_img  = curr_img.resize(size)     

            # 如果需要在图片上添加文字,可以通过ImageDraw来进行操作
            draw = ImageDraw.Draw(new_img)

            if text_id =='1':
                # 如果是孩子的编号,则进一步判断当前图片编号第2位字符是否与当前孩子信息相符,以便添加孩子的信息
                if str(c_id+1) == img_name[1:2]:
                    # 添加文本,所需参数分别是:位置,文字内容,颜色,字体
                    draw.text((120, 15), c_info, (0, 180, 200), font=fontStyle) 
                    # 保存新的文件到当前目录,新文件的命名规则为: "F_" + 孩子信息 + 当前的日期 + 原图片名
                    new_img_path = os.path.join(img_path, "F_" + c_info + "_"+datetime.datetime.now().strftime('%Y-%m-%d')+"_"+img_name)
                else:
                    # 如果不是当前孩子的图片,则跳过
                    continue
            else:
                # 否则添加家长的信息:
                draw.text((120, 15), c_info + text_content[text_id], (0, 180, 200), font=fontStyle) 
                # 保存新的文件到当前目录,新文件的命名规则为: "F_" + 孩子信息 + 家长信息 + 当前的日期 + 原图片名
                new_img_path = os.path.join(img_path, "F_" + c_info + text_content[text_id]+"_"+datetime.datetime.now().strftime('%Y-%m-%d')+"_"+img_name)
            
            new_img.save(new_img_path)

            """
            # 如果不需要保留原始图片,可以在最后一个孩子的信息添加完成后删除。
            if c_id + 1 == len(text_content["1"]):
                os.remove(curr_img)
            """

"""# 第四步, 显示完成。如果有后续提交内容页面的网址,也可以设定自动提交,如果暂没有,就手动提交。"""
print("    >>> 目录中符合条件的图片已全部处理完成,按任意键退出!")
os.system("pause")

以上就是关于往屏幕截图上添加文本内容的全部内容以及代码,如需可执行文件请点击下载 。

如果是学校或者单位需要添加当前日期下所有年级段,所有班级的学生信息,则可以将目录结构变更为日期\年级\班级\学生学号,适当调整一下代码中的循环,或者,可以新建一个递归函数,遍历当前日期目录下的所有文件夹,即可完成对所有图片的文本信息添加。

希望对你有所启发,如有不足之处,请指出,谢谢!