一张模板图,一份 Excel 名单,要生成几百张内容各不相同的图——电商主图、培训证书、工牌、商品标签、活动海报都是这类需求。这篇讲三种做法,包括 Photoshop 自带的数据驱动功能。
"批量给图片加文字"其实是三种完全不同的活,用错方法会白折腾:
| 需求 | 典型场景 | 文字来源 |
|---|---|---|
| 每张图加一行字 | 批量加水印、加编号、加署名 | 一个 TXT,一行对一张图 |
| 每张图加一段话 | 产品说明图、语录图、多行文案 | TXT,需要自动换行 |
| 每张图加多块字 | 证书(姓名+课程+日期+编号)、电商主图(标题+卖点+价格) | 表格,每列一块内容 |
前两种相对简单。真正麻烦的是第三种——同一张图上,姓名要居中放大、日期要小字放右下、编号要靠左,每块文字的位置、字号、颜色、是否加底框全都不一样。这篇主要讲第三种。
很多人不知道 PS 自带这个功能,它本来就是为批量出图设计的。
name、date、code)name 图层,勾选「文本替换」,变量名填 name。其余图层同样处理name,date,code
张三,2026-08-10,NO.001
李四,2026-08-10,NO.002结论:PS 适合模板固定、数据量不大、文字长度可控的场景,比如统一格式的证书。
用 Pillow 库读 CSV 批量绘制,灵活度最高:
import csv
from PIL import Image, ImageDraw, ImageFont
TEMPLATE = "template.png"
FONT_PATH = "C:/Windows/Fonts/msyh.ttc"
with open("data.csv", encoding="utf-8-sig") as f:
for i, row in enumerate(csv.DictReader(f), 1):
img = Image.open(TEMPLATE).convert("RGB")
draw = ImageDraw.Draw(img)
# 姓名:居中大字
font_name = ImageFont.truetype(FONT_PATH, 72)
w = draw.textlength(row["name"], font=font_name)
draw.text(((img.width - w) / 2, 400), row["name"],
font=font_name, fill="#222222")
# 日期:右下小字
font_small = ImageFont.truetype(FONT_PATH, 28)
draw.text((img.width - 300, img.height - 120), row["date"],
font=font_small, fill="#666666")
# 编号:左下小字
draw.text((120, img.height - 120), row["code"],
font=font_small, fill="#666666")
img.save(f"out/{i:04d}_{row['name']}.png")
print("完成")
这是实际使用中最常遇到的问题,脚本里得自己实现:
def fit_font(draw, text, path, max_size, min_size, max_width):
size = max_size
while size > min_size:
font = ImageFont.truetype(path, size)
if draw.textlength(text, font=font) <= max_width:
return font
size -= 2
return ImageFont.truetype(path, min_size)
睿君图片批量加文字·多预设版就是按表格驱动这个思路做的:
每个预设可以单独设置的项:字体文件与字号、文字颜色与描边(颜色/宽度)、行间距、换行规则(按字数 / 按标点 / 两者叠加)、坐标与居中模式、背景框(颜色/透明度/内边距/圆角)、对齐方式,以及自动缩小字号(设一个最小字号下限,文字过长时自动收缩,不会顶出画面)。
预设能存成文件复用——这一批证书调好的参数,下一批直接调用。
如果你的需求没这么复杂,同系列还有两个更简单的:每张图加一段多行文案、需要标题正文两种样式的,用段落款;只是批量加一行水印文字的,用单行款就够,它支持图片和文字数量不等时循环复用。
| 对比项 | Photoshop | Python 脚本 | 专用工具 |
|---|---|---|---|
| 费用 | PS 订阅 | 免费 | 付费 |
| 门槛 | 会 PS | 会写代码 | 低 |
| 多文字块各自样式 | 做不到 | 要自己写 | 支持 |
| 文字过长自动缩小 | 不支持 | 要自己写 | 支持 |
| 可视化定位 | 有 | 无 | 有 |
| 预设复用 | 模板 PSD | 改代码 | 预设文件 |
| 适合 | 格式统一的证书 | 会编程、需求特殊 | 多字段批量出图 |
表格第一列一定放图片文件名。这样每行数据和底图明确对应,出错时好排查。文件名建议不含空格和特殊字符。
先拿 3 行数据试跑。特意挑最长的名字、最长的标题放进去试——排版问题基本都是被最长的那条撑出来的。
CSV 一律存 UTF-8。Excel 里要用「另存为 → CSV UTF-8(逗号分隔)」,用默认的 CSV 格式存中文十有八九乱码。
给长文字留退路。要么在表格里限制字数,要么用支持自动缩小字号的方案。指望"应该不会有那么长的",最后一定会有。
Q:CSV 里的中文是乱码怎么办?
用「另存为 → CSV UTF-8」重存一次。程序读取时优先按 UTF-8-SIG 解码,能兼容 Excel 存的带 BOM 的文件。
Q:不同图片尺寸不一样,坐标怎么统一?
用相对定位或居中模式,别写死绝对坐标。有像素模式的方案会按图片短边比例自动缩放字号和坐标,一套参数适配多种尺寸。
Q:能不能一张图配多行数据,或者一行数据配多张图?
表格驱动的逻辑是一行数据对一张图。如果是"图片少、文字多"想循环复用,那是单行款的循环添加功能。
Q:文字要压在图片主体上,看不清怎么办?
加描边,或者启用半透明背景框(可调颜色、透明度、内边距、圆角)。背景框比描边更保险,尤其是背景复杂的实拍图。
Q:处理后图片质量下降?
注意输出格式和质量设置。JPG 建议质量 95 以上,或者直接输出 PNG。需要保留 EXIF、DPI、ICC 色彩配置的话,要选支持这些的方案。
相关阅读:几千个文件怎么平均分配到多个文件夹?
下一篇:没有了!
86998867
微信同号
