引言
在刷小红书的时候,刷到一个老师发帖:说要给学生照片的右下角批量添加水印,一张张手动添加不仅速度慢,还无法保证对齐。


后来了解到,在学校、体检中心或健身房的工作场景中,我们经常需要处理成百上千张照片,并将对应的身高、体重信息标注在照片上。 手动使用 PS 或是美图秀秀一张张修改不仅效率低下,而且极易出错。
为了方便工具给更多人使用,我对excel的格式做了一些修改,增加了一列照片的文件名:

今天,我们将利用 Python 开发一个可视化工具。 它能够读取 Excel 里的学生信息,自动在对应的照片右下角绘制红色黑体字,并支持自定义标题、自动适配照片分辨率。
核心功能
- 自动化匹配:通过 Excel 中的文件名列,精准锁定对应的照片。
- 动态排版:文字大小根据照片分辨率自动缩放,确保在高清大图或手机照片上都有良好的视觉效果。
- 人性化 GUI:无需运行代码命令行,点击按钮即可选择文件和保存位置。
- 智能纠错:自动跳过 Excel 中的空行或文件夹中缺失的照片。
- 名字居中:多行文本块中,名字相对于其他信息水平居中,排版更美观。
工具下载
如果你对技术不感兴趣,这里直接放出工具获取方式:
关注公众号“易派森”,在对话框输入“照片批量水印”获取下载地址。
其中exe文件直接双击打开即可使用。
使用方法

第一步
首先需要准备两个文件:
一个是保存有学生信息的excel文件, 如果有几个学生的照片暂时没有,那就空着也没事
二是照片文件夹:
注意文件名要和excel中的完全一致,不然是找不到的。
第二步
输入第一行的文字,比如“三年级上册”
然后选择照片所在文件夹和excel,再选一个文件夹保存修改后的照片

第三步
点击“开始处理”

等进度条走完后,会提示完成信息:
打开刚刚选择的保存文件夹,就能看到修改后的照片:
技术讲解
如果对技术感兴趣,可以看看下面的一些技术细节
技术栈
- Pandas & Openpyxl:用于高效处理 Excel 数据。
- Pillow (PIL):强大的图像处理库,负责文字绘制。
- Tkinter:Python 内置的 GUI 库,用于构建操作窗口。
- Threading:多线程处理,确保批量任务时界面不卡死。
核心代码逻辑解析
动态计算字体大小
如果照片是 4000 像素,固定字体大小会显得非常小;如果是 800 像素,固定大小又会占满屏幕。我们采用百分比计算法:
# 根据图片高度动态调整字体大小 (设为高度的 3.5%)font_size = int(img.height * 0.035)font = ImageFont.truetype("simhei.ttf", font_size)
文本块的精准定位
为了让文字始终出现在右下角,我们需要先计算文字块的总宽度和总高度,再用图片的总宽高减去边距得出起始坐标。
bbox = draw.multiline_textbbox((0, 0), text_content, font=font, spacing=line_spacing)tw, th = bbox[2]-bbox[0], bbox[3]-bbox[1]# 设置边距,计算起始坐标 (x, y)margin_x = int(img.width * 0.05)margin_y = int(img.height * 0.05)x = img.width - tw - margin_xy = img.height - th - margin_y
GUI 与后台线程分离
在 GUI 程序中,如果直接点击按钮执行耗时任务,界面会进入“未响应”状态。通过 threading.Thread,我们可以让后台处理数据,前端实时更新进度条。
完整代码实现
关注公众号“易派森”,在对话框输入“照片批量水印”获取完整代码。
总结
通过这个小项目,我们不仅学会了如何使用 Python 处理图像和 Excel,还接触到了简单的 GUI 开发和多线程优化。 原本需要大半天才能完成的体力活,现在只需点点鼠标,几分钟即可搞定。这正是 Python 自动化办公的魅力所在!
如果你有类似的需求或在运行中遇到问题,欢迎在公众号易派森联系我