用Python和Pillow批量生成社交媒体图片:从模板设计到一键导出的实战指南

loong
2026-05-29 / 0 评论 / 21 阅读 / 正在检测是否收录...

直接上干货,不啰嗦。很多人做公众号封面、小红书笔记图、朋友圈海报、活动宣传图时,最痛苦的不是设计一张图,而是改几十张图。

标题要换,副标题要换,日期要换,背景色可能也要换。手动用设计工具一张张导出,刚开始还能忍,做到第20张基本就想关电脑。

这篇文章就手把手教你用Python自动化批量生成社交媒体图片,核心工具是Pillow。小白也能轻松搞定,只要你会运行Python脚本,就能做出一套自己的批量出图流程。

适合用Pillow做什么?先别把它想得太万能

Pillow很适合做这类固定模板图片:

  • 每日金句海报
  • 公众号文章封面
  • 小红书标题卡片
  • 电商活动促销图
  • 课程宣传长图的局部模块
  • 批量生成带姓名、二维码、编号的邀请函

简单来说,只要图片结构比较固定,文字和图片素材经常变化,就很适合自动化。

但我也先说清楚:如果你想做特别复杂的排版,比如大量自由形状、复杂图层混合、高级字体特效,Pillow不是最舒服的选择。它的优势是稳定、轻量、可控,适合批量生产,不是替代所有设计软件。

快速方案:一张模板图 + 一份数据表 + 一个Python脚本

我常用的流程很简单:

  1. 先设计一张背景模板图,比如 template.png
  2. 准备一份数据,比如 data.csv
  3. Python读取数据
  4. Pillow把标题、副标题、日期写到模板上
  5. 自动导出多张图片

目录可以这样放:

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,把上面的代码跑起来。跑通的那一刻,你会明显感觉:重复劳动终于少了一大块。

赏金: 1.68 缘

⚠ 温馨提示: 完成赞赏后 可能有彩蛋哟~

赞赏后可读区
0