Pillow实战:AI用Python代码画图的正确姿势
「AI 画图靠想象力,代码画图靠精确度。两者都是创造,但一个是诗,一个是工程图纸。」
——《AI时代漫游指南》第 131 章·逐像素的手艺
AI 画图很酷。但有些图不需要想象力——它需要精确度。
状态卡片、数据报表、日报封面——每一个像素都必须在正确的位置。
解决方案:Pillow(PIL)。 Python 最经典的图像处理库。不靠 AI,靠数学。
编者注: AI 画图和代码画图不是竞争关系,是互补关系。你不会用 Stable Diffusion 画一张数据表格,也不会用 Pillow 画一幅油画。
我的真实用法:Agent 人物卡
我有一个 Agent Guild 系统,管理十几个 AI Agent。每个 Agent 有一张"人物卡"——纯代码生成的 PNG。
from PIL import Image, ImageDraw, ImageFont
defrenderagentcard(data):
# 1. 预计算高度(内容是动态的)
totalh = headerh + resph + attrh + footerh
# 2. 创建深色画布
img = Image.new('RGB', (520, totalh), '#0f1117')
draw = ImageDraw.Draw(img)
# 3. 逐层绘制:圆角矩形 → 文字 → 状态灯
draw.roundedrectangle([0, 0, 520, headerh], radius=12, fill='#1e2235')
draw.text((24, 24), name, font=font26, fill='#f8fafc')
draw.ellipse([x, y, x+7, y+7], fill='#34d399') # 绿色=在线
img.save(outpath, 'PNG')
一张卡包含:名称、状态灯、职责列表、模型配置、画像描述。全部动态生成。
编者注: 代码画图的好处是:一旦调好了,它永远不会变。每次生成的图片完全一致。不像 AI 画图,每次都是"开盲盒"。
5 分钟入门
from PIL import Image, ImageDraw, ImageFont
img = Image.new('RGB', (400, 200), '#1a1d27')
draw = ImageDraw.Draw(img)
draw.roundedrectangle([20, 20, 380, 180], radius=12, fill='#2a2f45')
draw.text((40, 80), 'Hello Pillow', font=font, fill='#e2e8f0')
img.save('hello.png')
编者注: Image.new() 的第一个参数是颜色模式。RGB 最常用。需要透明背景用 RGBA。
6 个核心技巧
1. 配色系统
THEME = {
'bg': '#0f1117',
'accent': '#5b8dee',
'text': '#e2e8f0',
'success': '#34d399',
'error': '#f87171',
}
编者注: 配色系统的本质是"设计决策的缓存"。做一次决策,之后所有图片自动保持一致。
2. 中文换行
defwraptext(text, font, maxwidth):
lines, current = [], ''
for char in text:
if font.getlength(current + char) > maxwidth and current:
lines.append(current)
current = char
else:
current += char
if current:
lines.append(current)
return lines
编者注: 字体文件是跨平台部署的隐形杀手。本地用苹方很好看,Linux 上字体不存在。把字体打包进项目是基本生存技能。
3. 圆角矩形
draw.roundedrectangle([x, y, x+w, y+h], radius=10, fill=color)
Pillow 4.2+ 内置支持,不需要手动算弧线。
4. 状态指示灯
# 绿色小圆点=在线
draw.ellipse([x, y, x+7, y+7], fill='#34d399')
5. Emoji 替换
EMOJIMAP = {'✅': '[OK]', '❌': '[ERR]', '💤': '[休]'}
6. 动态高度
totalh = headerh + len(items) lineheight + footerh
img = Image.new('RGB', (520, total_h))
编者注: HTML+CSS 比 Pillow 更适合复杂布局——浏览器帮你算高度。但 Pillow 的优势是:不需要浏览器,一个纯 Python 脚本就能跑。
和其他方案对比
| 方案 | 精确度 | 复杂布局 | 依赖 |
|---|
| Pillow | 像素级 | 手动 | 纯 Python |
| HTML→截图 | 高 | CSS 自动 | 需浏览器 |
| matplotlib | 中 | 图表专用 | 纯 Python |
编者注: 简单卡片/海报用 Pillow,复杂多栏布局用 HTML→截图。选最简单的那个。
踩过的坑
字体路径。 相对路径换目录就找不到。用绝对路径。
颜色格式。 老版本只接受 RGB 元组 (26, 29, 39),新版本支持十六进制 '#1a1d27'。
画布外的文字。 文字坐标算错画到画布外面,不报错但看不到。很隐蔽。
写在最后
在 AI 画图满天飞的时代,代码画图看起来很笨拙。
但它做到了 AI 做不到的事:每一个像素都在你的控制之下。
「AI 画图靠想象力,代码画图靠精确度。两者都是创造,但一个是诗,一个是工程图纸。」
觉得有用?分享给需要的朋友。关注「漫游指南AI」。