当前位置:首页>python>Pillow实战:AI用Python代码画图的正确姿势

Pillow实战:AI用Python代码画图的正确姿势

  • 2026-09-15 21:27:58
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 分钟入门

pipinstallPillow
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')
5 行代码,一张图就出来了。
编者注: 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 替换
大多数字体不含 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 做不到的事:每一个像素都在你的控制之下。
5 行代码,一张图。精确到像素。
「AI 画图靠想象力,代码画图靠精确度。两者都是创造,但一个是诗,一个是工程图纸。」

觉得有用?分享给需要的朋友。关注「漫游指南AI」。
  

最新文章

随机文章