在进行批量海报生成之前,必须先配置好Python运行环境。本指南基于Python 3.8版本编写,请确保你的电脑已经安装了Python。如果尚未安装,请前往Python官网下载安装包并完成安装,安装过程中务必勾选"Add Python to PATH"选项。
我们需要使用两个核心库:Pillow(用于图像处理)和pandas(用于读取Excel/CSV数据)。打开终端(Terminal)或命令提示符(CMD),依次执行以下命令进行安装:
pip install pillow pandas
安装完成后,可以通过执行 pip list 查看已安装的列表,确认这两个库是否已成功存在。
为了确保代码能够准确读取素材和输出结果,请务必在本地严格按照以下目录结构创建文件夹和文件。假设我们的项目文件夹名为 brand_poster_generator:
注意:请自行准备一张名为 bg.png 的背景图片放入 templates 文件夹,并下载一个支持中文的字体文件(如 SimHei.ttf)放入 fonts 文件夹。如果找不到字体文件,可以从Windows系统的 C:\Windows\Fonts\ 目录中复制 simhei.ttf 出来。
我们需要创建一个CSV文件来存储品牌产品的信息,包括产品名称、价格、卖点以及种草文案。在 data 文件夹下新建 products.csv 文件,并使用Excel或记事本填入以下内容。保存时请确保编码格式为 UTF-8:
```csv
product_name,price,feature,review_text
极速美白精华,299.00,28天焕亮肌肤,"亲测有效!用了一段时间,同事都问我是不是换了粉底液,毛孔细腻了很多,无限回购!"
深层清洁面膜,128.50,吸走毛孔污垢,"敷完黑头真的少了,鼻子摸起来滑滑的,而且不紧绷,敏感肌集美可以冲!"
修护舒缓喷雾,89.90,泛红急救神器,"换季皮肤容易过敏,这个喷雾喷一下立马舒服,成分表很干净,放心入。"
```
这个CSV文件的第一行是表头,后续每一行代表一个产品的数据。代码将读取这些数据并将其填充到海报的指定位置。
在项目根目录下创建 main.py 文件。我们将编写代码来实现自动读取背景图、加载字体、解析CSV数据、绘制文字并保存图片的逻辑。以下是完整的代码,可以直接复制使用:
```python
import os
import pandas as pd
from PIL import Image, ImageDraw, ImageFont
定义路径常量
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
TEMPLATE_PATH = os.path.join(BASE_DIR, 'templates', 'bg.png')
FONT_PATH = os.path.join(BASE_DIR, 'fonts', 'simhei.ttf')
DATA_PATH = os.path.join(BASE_DIR, 'data', 'products.csv')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')
确保输出目录存在
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
def draw_text_with_wrap(draw, text, font, max_width, initial_x, initial_y, fill_color, line_spacing=10):
"""
绘制自动换行的文本
:param draw: ImageDraw对象
:param text: 文本内容
:param font: 字体对象
:param max_width: 每行最大宽度(像素)
:param initial_x: 起始X坐标
:param initial_y: 起始Y坐标
:param fill_color: 字体颜色
:param line_spacing: 行间距
:return: 最后一行结束的Y坐标
"""
lines = []
current_line = ""
遍历每个字符进行宽度计算
for char in text:
test_line = current_line + char
获取文本边界框
bbox = draw.textbbox((0, 0), test_line, font=font)
width = bbox[2] - bbox[0]
if width < max_width:
current_line = test_line
else:
lines.append(current_line)
current_line = char
lines.append(current_line)
y_offset = initial_y
for line in lines:
draw.text((initial_x, y_offset), line, font=font, fill=fill_color)
获取当前行高度以增加Y偏移
bbox = draw.textbbox((0, 0), line, font=font)
line_height = bbox[3] - bbox[1]
y_offset += line_height + line_spacing
return y_offset
def generate_posters():
1. 读取数据
try:
df = pd.read_csv(DATA_PATH, encoding='utf-8')
except FileNotFoundError:
print(f"错误:找不到数据文件 {DATA_PATH}")

return
except Exception as e:
print(f"读取CSV文件出错: {e}")
return
2. 加载背景图和字体
try:
bg_image = Image.open(TEMPLATE_PATH).convert('RGBA')
except FileNotFoundError:
print(f"错误:找不到背景模板 {TEMPLATE_PATH}")
return
定义字体样式 (大小可根据背景图调整)
try:
font_title = ImageFont.truetype(FONT_PATH, 60)
font_price = ImageFont.truetype(FONT_PATH, 50)
font_feature = ImageFont.truetype(FONT_PATH, 40)
font_review = ImageFont.truetype(FONT_PATH, 30)
except IOError:
print("错误:找不到字体文件,请检查fonts目录下的simhei.ttf")
return
print(f"开始生成海报,共 {len(df)} 个产品...")
3. 遍历数据生成海报
for index, row in df.iterrows():
复制一份背景图作为画布
canvas = bg_image.copy()
draw = ImageDraw.Draw(canvas)
获取数据
name = str(row['product_name'])
price = f"¥{str(row['price'])}"
feature = str(row['feature'])
review = str(row['review_text'])
绘制内容 (坐标需根据实际背景图调整)
绘制产品名称 (X:50, Y:150)
draw.text((50, 150), name, font=font_title, fill='333333')
绘制价格 (X:50, Y:230)
draw.text((50, 230), price, font=font_price, fill='FF4500')
绘制卖点标签 (X:50, Y:300)
简单的标签背景绘制逻辑
text_bbox = draw.textbbox((50, 300), feature, {font=feature})
draw.rectangle([text_bbox[0]-10, text_bbox[1]-5, text_bbox[2]+10, text_bbox[3]+5], fill='FFE4E1')
draw.text((50, 300), feature, font=font_feature, fill='FF1493')
绘制种草文案 (自动换行,X:50, Y:400, 最大宽度700)
draw_text_with_wrap(draw, review, font_review, 700, 50, 400, '666666', line_spacing=8)
4. 保存图片
output_name = f"poster_{index+1}_{name}.png"
save_path = os.path.join(OUTPUT_DIR, output_name)
canvas.save(save_path)
print(f"已生成: {output_name}")
print("所有海报生成完毕,请查看output目录。")
if __name__ == "__main__":
generate_posters()
```
上述代码中包含几个关键的技术细节,直接决定了生成的海报是否可用,请务必理解这些逻辑以便后续自定义修改。
1. 自动换行处理 (draw_text_with_wrap函数)
种草文案通常较长,直接绘制会超出图片边界。代码中通过遍历字符并计算 draw.textbbox 的宽度来实现自动换行。如果一行文字的宽度超过 max_width,程序会自动将剩余文字移至下一行。这是制作海报最核心的功能之一。
2. 坐标系统
PIL库使用左上角为原点 (0,0) 的坐标系。代码中的 draw.text((50, 150), ...) 表示文字的左上角顶点位于X轴50像素、Y轴150像素的位置。如果你的背景图设计不同,需要手动修改这些坐标数值。建议先打印一张测试图,根据视觉效果微调坐标。
3. 颜色设置
代码中使用了十六进制颜色码,例如 '333333' 代表深灰色,'FF4500' 代表橙红色。你可以通过Photoshop或取色器工具获取品牌VI的标准色值替换代码中的颜色,以确保海报风格统一。
4. 异常处理
代码在读取文件和加载字体时加入了 try-except 块。如果找不到 simhei.ttf 或 bg.png,程序会打印具体的错误路径而不是直接崩溃,这能极大降低排查问题的时间成本。
所有文件准备就绪后,回到项目根目录 brand_poster_generator。在终端中执行以下命令启动程序:
python main.py
如果一切正常,终端会依次输出以下日志信息:
开始生成海报,共 3 个产品...
已生成: poster_1_极速美白精华.png
已生成: poster_2_深层清洁面膜.png
已生成: poster_3_修护舒缓喷雾.png
所有海报生成完毕,请查看output目录。
此时打开 output 文件夹,你将看到三张已经合成好的海报图片。每张图片都包含了对应的产品名称、价格、卖点标签以及自动换行排列的种草文案。你可以直接将这些图片用于社交媒体发布、朋友圈推广或电商详情页展示。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图