代码排版小红书封面 · 工作流与复盘
首次记录:2026-06-17 来源:「牧云人」独立作品封面制作(一张 MJ 雾山牧羊原图 → 小红书封面 + 无字壁纸 + 发布文案) 状态:流程已跑通,跨”单张原图 → 排版封面”场景通用 配套代码:make_cover / make_clean(镜像于
06_代码/46_牧云人封面/)
一句话
用 Pillow 代码排版做封面,比丢进设计软件更适合”批量、可复现、参数化微调”的封面生产——但前提是先解决三个隐形卡点:找回原图、保住高光、去掉水印。
卡点 1:粘贴进对话的图,不在磁盘上
用户把图直接粘贴到对话里时,它不会落成一个可访问的文件。实测排查路径:
%TEMP%下的.tmp/.webp:要么被进程独占(PermissionError),要么是 UI 切片、图标缩略(48×4032、100×100),都不是原图。- 会话临时目录
…/claude/<session>/:只有tasks/,没有图。
结论:别在 temp 里捞。可靠做法是去用户指定的真实目录(这次是 Downloads)做视觉检索——
# 对目录里最近 N 张图拼一张 6×4 缩略接触表, 一眼定位
files = sorted(imgs, key=os.path.getmtime, reverse=True)[:24]
sheet = Image.new('RGB', (6*200, 4*200), (30,30,30))
for i,p in enumerate(files):
t = Image.open(p).convert('RGB'); t.thumbnail((192,174))
sheet.paste(t, ((i%6)*200+4, (i//6)*200+4))
draw.text(..., str(i)+':'+os.path.basename(p)[:22]) # 标号+文件名
靠文件名猜会漏(MJ 文件名是 a_tiny_lost_cloud_resting_on_a_grassy_hills_…,跟”牧羊/老人”对不上),接触表一眼就锁定。这是本次最省时间的一招。
卡点 2:暗角要保高光,不能全图压暗
封面文字压在画面上要保证可读,但全图盖一层暗色 scrim 会把云朵/主体高光一起压灰,破坏氛围。
做法:以”文字所在的角”为中心的椭圆衰减暗角,只压那个角,云朵(画面中心)和人物(右侧)原样保留。
# 左上角椭圆暗角: alpha = clip(1 - ((x-cx)/rx)^2 - ((y-cy)/ry)^2, 0,1)^1.6 * amax
yy, xx = np.mgrid[0:h, 0:w]
d = ((xx-cx)/rx)**2 + ((yy-cy)/ry)**2
a = np.clip(1-d, 0, 1)**1.6 * amax # 指数 1.6 让边缘更柔
颜色用深蓝灰 (18,26,36) 而非纯黑,跟雾蓝调一致,不发脏。
卡点 3:边缘水印——裁切 > 克隆
原图右下角有作者水印「Z」。处理水印的两条路:
| 方案 | 适用 | 代价 |
|---|---|---|
| inpaint / clone 涂抹 | 水印压在主体上、不能裁 | 易留痕,参数难调 |
| 百分比裁切 | 水印在画面边缘(底部中心/角落) | 几乎零成本,可参数化 |
水印在底部边缘 ~96% 高度,TRIM_BOTTOM = 0.06 先裁底再 cover-fit 到 3:4,水印连同冗余前景一起消失,主体不受影响。封面版和无字壁纸版共用同一个裁切参数,保证两张图主体一致。
完整排版流程(Pillow)
原图
└─ 裁底去水印 (TRIM_BOTTOM)
└─ 2× supersample 画布 (抗锯齿: 全程 2 倍尺寸, 最后 LANCZOS 缩回)
└─ cover-fit 等比裁 3:4 (max scale + 居中裁)
└─ 椭圆暗角 (只压文字角)
└─ 竖排中文排版
│ ├─ 主标题 牧云人 → 宋体 simsun (编辑感、清晰)
│ └─ 副标落款 → 楷体 simkai (柔、诗意) · 错落下沉
└─ 文字柔和投影 (由文字层 alpha 派生 → 染深色 → 高斯模糊 → 垫底)
└─ 缩回 1080×1440 导出
要点:
- 竖排靠逐字
draw.text(anchor='mm')按步长下落实现,不是一次画一串。 - 投影别重画一遍文字:取文字层 alpha →
point(v*0.6)染深色 →GaussianBlur→ 偏移垫在文字下。一行搞定,且压在亮处也读得清。 - Windows 自带可用字体:宋体
simsun.ttc/ 楷体simkai.ttf/ 等线Deng*.ttf(拉丁小字用Dengl.ttf细体 + 字间距)。无思源宋体,别假设它在。
归档纪律(这次的运营教训)
- 别把作品塞进语义不符的目录。一开始顺手建在
盘丝洞/,但那是”AI 女性写真”专属文件夹——独立作品要建独立编号项目目录(沿用44_ / 45_ / 46_习惯)。 - 标准结构:
01_素材原图 / 02_成品封面 / 03_发布文案 / _脚本。 - 一张原图可派生多个成品:带字封面(主图)+ 无字壁纸(多图第 2 张/下载钩子)+ 发布文案,都归同一项目目录。
如何使用
- 下次”单张原图 → 小红书封面”直接拷
make_cover.py改SRC / 文案 / TRIM_BOTTOM。 - 先肉眼看原图的留白在哪个角,文字和暗角就放哪个角;云朵/人脸/主体高光所在的区域不要压。
- 水印先判断在不在边缘:在边缘 → 裁;压主体 → 才考虑 inpaint。
- 找不到原图别死磕 temp → 直接做缩略接触表视觉检索。
封标要随主题切设计语言(2026-06-23 即兴抽卡 07/08 补充)
同一抽卡合集里,主题跳出古风时,别套用统一模板(宋体竖排+楷体+暖金那套是”古风专用”,套到时尚/暗黑题材会立刻失味)。做法:保留 cover-fit / 柔投影 / 2x 超采样 脚手架不变,只换文本层的设计,并先上网查该题材的成功封标范式:
- 暗调戏剧(红衣裂面):骨白宋体竖排主标 + 朱红细竖线(弃暖金)+ 朱砂方印(白字戏/面,
simhei实心字)+ 角落柔暗(右上强、向下 taper,护住下方面具/主体)。大留白 + 血红是这一路的张力来源。 - 时尚编辑(白西装 OL):仿 Vogue 封面——Playfair Display(Didone 高反差衬线)报头置顶(可半隐于发丝,正是 Vogue 标志性手法),衬线报头 + 无衬线封面语(Didot 小字会断笔,故封面语另用无衬线)。报头下加细横线 + 期号小字,刊名/署名压右下。
落坑提醒:
HYZhongHeiTi-197.ttf(汉仪中黑)缺大量中文字形,PIL 渲染中文会出豆腐块 □□□。要现代无衬线中文,用msyh.ttc(微软雅黑) 才稳。- Windows 无 Didot/Playfair,需自取。Playfair Display 是 OFL,可
curl直拉 Google Fonts 变体字(PlayfairDisplay[wght].ttf),Pillow≥8 用font.set_variation_by_name('Black')选重量;字体随项目存_fonts/保证可复现。 - 配套代码:
{AIGC工作站}/48_即兴抽卡.../_build_covers_0708.py(mask / vogue 两套文本层 + numpy 角落渐变)。
关联文档
- 工具选择心法:代码生成vsGPT图像_工具选择假说(代码排版 vs 生成式出图,何时用哪个)
- 同源后期心法:MJ出图绕开抠图陷阱(边缘/背景问题在源头解决,别迷信后期算法)
- 署名规范实现:
06_代码/14_我的一天/封面水印/make_watermark.py(中英双字体 + supersample 的更早版本) - 多图封面母版:
06_代码/11_凝视/Day_1_v17/封面生成/make_xhs_cover.py(保人脸裁剪 + footer 署名) - 本作项目目录:
{AIGC工作站}/46_牧云人_小红书封面/