直接上干货,不啰嗦。很多人做公众号封面、小红书笔记图、朋友圈海报、活动宣传图时,最痛苦的不是设计一张图,而是改几十张图。
标题要换,副标题要换,日期要换,背景色可能也要换。手动用设计工具一张张导出,刚开始还能忍,做到第20张基本就想关电脑。
这篇文章就手把手教你用Python自动化批量生成社交媒体图片,核心工具是Pillow。小白也能轻松搞定,只要你会运行Python脚本,就能做出一套自己的批量出图流程。
适合用Pillow做什么?先别把它想得太万能
Pillow很适合做这类固定模板图片:
- 每日金句海报
- 公众号文章封面
- 小红书标题卡片
- 电商活动促销图
- 课程宣传长图的局部模块
- 批量生成带姓名、二维码、编号的邀请函
简单来说,只要图片结构比较固定,文字和图片素材经常变化,就很适合自动化。
但我也先说清楚:如果你想做特别复杂的排版,比如大量自由形状、复杂图层混合、高级字体特效,Pillow不是最舒服的选择。它的优势是稳定、轻量、可控,适合批量生产,不是替代所有设计软件。
快速方案:一张模板图 + 一份数据表 + 一个Python脚本
我常用的流程很简单:
- 先设计一张背景模板图,比如 template.png
- 准备一份数据,比如 data.csv
- Python读取数据
- Pillow把标题、副标题、日期写到模板上
- 自动导出多张图片
目录可以这样放:
poster_project/
template.png
data.csv
fonts/
SourceHanSansSC-Bold.otf
SourceHanSansSC-Regular.otf
output/
make_posters.py这里有个技巧:字体文件一定要自己放到项目里,不要完全依赖系统字体。因为你在自己电脑上能跑,不代表换一台电脑还能正常显示中文。
安装Pillow,先把环境跑通
如果你已经装好Python,直接执行:
pip install pillow如果你还要读取CSV,Python自带csv模块就够了,不需要额外安装。
接着往下看,我们先做一个最小可用版本。
准备数据:别一上来就搞复杂
data.csv可以这样写:
title,subtitle,date
如何提高内容生产效率,用Python批量生成封面图,第01期
3个适合新手的自动化脚本,少做重复劳动,第02期
Pillow实战入门,从文字排版到图片导出,第03期新手最容易踩的坑是CSV编码。建议保存为UTF-8。如果你用Excel编辑后中文乱码,可以试试用WPS、Numbers,或者用代码读取时指定 utf-8-sig。
核心代码:批量生成社交媒体图片
下面这段代码是简化版,但已经能完成真实工作。你可以直接复制,然后改路径、坐标和字号。
from PIL import Image, ImageDraw, ImageFont
import csv
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
TEMPLATE = os.path.join(BASE_DIR, 'template.png')
DATA = os.path.join(BASE_DIR, 'data.csv')
OUT_DIR = os.path.join(BASE_DIR, 'output')
FONT_BOLD = os.path.join(BASE_DIR, 'fonts/SourceHanSansSC-Bold.otf')
FONT_REGULAR = os.path.join(BASE_DIR, 'fonts/SourceHanSansSC-Regular.otf')
os.makedirs(OUT_DIR, exist_ok=True)
def draw_text(draw, text, position, font_path, size, fill):
font = ImageFont.truetype(font_path, size)
draw.text(position, text, font=font, fill=fill)
def make_image(row, index):
img = Image.open(TEMPLATE).convert('RGB')
draw = ImageDraw.Draw(img)
draw_text(draw, row['title'], (90, 180), FONT_BOLD, 58, (30, 30, 30))
draw_text(draw, row['subtitle'], (90, 280), FONT_REGULAR, 32, (90, 90, 90))
draw_text(draw, row['date'], (90, 620), FONT_REGULAR, 26, (120, 120, 120))
filename = f'poster_{index:03d}.jpg'
img.save(os.path.join(OUT_DIR, filename), quality=95)
with open(DATA, 'r', encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
for i, row in enumerate(reader, start=1):
make_image(row, i)
print('生成完成')做好了这一步,你已经拥有一个基础版的Python批量出图工具。
重点是这个:文字太长怎么办?
真实场景里,标题不可能都一样长。短标题好看,长标题直接冲出画布,这也是Pillow批量生成图片最常见的问题。
解决办法是自动换行。
def wrap_text(text, font, max_width):
lines = []
current = ''
for char in text:
test = current + char
box = font.getbbox(test)
width = box[2] - box[0]
if width <= max_width:
current = test
else:
lines.append(current)
current = char
if current:
lines.append(current)
return lines
def draw_wrapped_text(draw, text, x, y, font_path, size, fill, max_width, line_gap):
font = ImageFont.truetype(font_path, size)
lines = wrap_text(text, font, max_width)
for line in lines:
draw.text((x, y), line, font=font, fill=fill)
y += size + line_gap然后把标题绘制改成:
draw_wrapped_text(draw, row['title'], 90, 170, FONT_BOLD, 54, (30, 30, 30), 850, 12)这个方法亲测有效,尤其适合中文标题。英文会涉及单词拆分,处理方式略有不同,可以按空格分词再拼接。
图片尺寸怎么选?别随便设
不同平台常用尺寸不一样。你不需要记一堆标准,但至少要知道自己的目标场景。
常见选择:
- 公众号封面:常用横图比例,注意移动端裁切
- 小红书封面:常见为竖图,比如3:4或4:5
-朋友圈海报:方图和竖图都常见 - 短视频封面:通常按平台推荐比例准备
我的建议是:先确定一个主平台,再围绕它设计模板。不要一套图硬适配所有平台,最后往往哪里都不舒服。
想让图片更像设计稿,可以加这些小细节
Pillow不是只能写字。你还可以做很多实用效果:
添加半透明色块
overlay = Image.new('RGBA', img.size, (255, 255, 255, 0))
od = ImageDraw.Draw(overlay)
od.rounded_rectangle((60, 130, 1020, 520), radius=30, fill=(255, 255, 255, 210))
img = Image.alpha_composite(img.convert('RGBA'), overlay).convert('RGB')添加头像或产品图
avatar = Image.open('avatar.png').convert('RGBA').resize((120, 120))
img.paste(avatar, (820, 560), avatar)导出高清图
如果要发社交媒体,建议模板一开始就按目标尺寸或2倍尺寸设计。不要先做小图再强行放大,画质会糊。
新手最容易踩的5个坑
1. 中文字体显示成方块
原因通常是字体不支持中文,或者字体路径写错。解决办法是把中文字体文件放进fonts目录,并用绝对路径加载。
2. 坐标调半天还是不准
Pillow的坐标从左上角开始,x向右,y向下。建议先在模板上画参考线,或者临时用矩形框标出文字区域。
3. 图片导出后颜色变了
不同工具、不同色彩配置会有差异。社交媒体日常发布一般用RGB就够了,保存前统一 convert('RGB')。
4. 文件名重复被覆盖
批量生成时一定要加编号,或者用标题生成文件名。标题做文件名时要过滤特殊字符。
5. 模板改了,代码坐标全废
这个很正常。我的做法是把坐标集中放到配置区,不要散落在代码各处。后期维护会轻松很多。
一个更好维护的写法:把样式集中管理
当模板越来越多,建议这样写:
STYLE = {
'title': {'pos': (90, 170), 'size': 54, 'color': (30, 30, 30), 'max_width': 850},
'subtitle': {'pos': (90, 330), 'size': 32, 'color': (90, 90, 90)},
'date': {'pos': (90, 620), 'size': 26, 'color': (120, 120, 120)}
}这样设计改版时,你不用到处找坐标。说实话,脚本能不能长期用,很多时候不取决于代码多高级,而取决于它好不好改。
FAQ:几个常见问题
Pillow适合完全没有Python基础的人吗?
适合入门,但最好先会运行脚本、安装库、修改文件路径。不会也没关系,跟着做就行,先跑通一个案例,比看十篇语法教程更有感觉。
可以批量生成带二维码的海报吗?
可以。二维码可以提前生成成PNG,再用 paste 贴到指定位置。如果想全自动生成二维码,可以配合 qrcode 这个库。
能不能用Excel当数据源?
可以,但我更建议初期用CSV。CSV简单、透明、少踩坑。等流程稳定后,再用 openpyxl 读取Excel。
生成PNG还是JPG?
如果有透明背景,用PNG。如果是普通社交媒体图,用JPG就够了,文件更小。封面、海报这类图片,我通常用JPG并设置 quality=95。
结尾:先做一个能用的版本,再慢慢优化
用Python自动化批量生成社交媒体图片,核心不是写出多复杂的代码,而是把重复劳动交给脚本。
我的建议很简单:先做一张模板,跑通标题、副标题、日期这三个字段。确认能稳定导出后,再加自动换行、头像、二维码、不同尺寸、多模板切换。
别一开始就追求完美。能用,稳定,好改,这三个标准比花哨更重要。
如果你现在正被批量改图折磨,今天就建个文件夹,放一张模板,写一份CSV,把上面的代码跑起来。跑通的那一刻,你会明显感觉:重复劳动终于少了一大块。
