用 AI 批量生成高密度拼贴风博客封面:一套可完整复现的提示词工作流

用 AI 批量生成高密度拼贴风博客封面:一套可完整复现的提示词工作流

2026年9月23日·#ai使用AI绘图/博客/提示词工程·7961 字 40 分钟
浏览量加载中...
AI 摘要- DeepSeek

《Python 学习笔记》封面工程的完整方法论(v3,截至第 68 篇 +《羊毛分享》2 篇):设计规范、提示词模板、表情池、变量速查表、工具链、后处理脚本和全部踩过的坑。把这篇文章原样交给任何 AI 智能体,配上素材,就能生成同样的效果。

封面图
用 AI 批量生成高密度拼贴风博客封面:一套可完整复现的提示词工作流 - 封面图

这篇文章记录我给本博客《Python 学习笔记》系列生成封面图的完整方法论:设计规范、提示词模板、工具链、后处理脚本和踩过的坑。 把它原样交给任何一个 AI 智能体(WorkBuddy、Claude、GPT 之类),配上素材,就能生成同样的效果。 版本:v4(覆盖第 168 篇 + 《羊毛分享》2 篇 + JavaWeb 113 篇实战经验) v3 变更:新增**「人物表情」为第四个必变变量**,并给出表情池与选择规则(原 v2 只规定动作/主图/主色三个变量,导致 168 张人物的眼眉嘴几乎是同一套)。 v4 变更:废除「右下角 8%×8% 净空」约束——实测模型会把这句话渲染成一块硬边空白矩形/纯色方块(JavaWeb 批次 67/113 中招);改为「画面自然延伸到四角 + 显式禁止空白矩形」。另定铁律:封面出问题一律整张重新生成,不做像素级修复。

一、最终效果:什么是「高密度拼贴」封面#

这套封面系统经历了 6 轮风格迭代(科技极简 → 黑板粉笔 → 统一深墨绿 → 灰黑高密度 → 原创版式 → 高密度拼贴),最终定型为:

  • 一块灰黑炭笔黑板当底色(约 #26282B,注意是灰黑不是墨绿),带粉笔擦痕、四周暗角、颗粒噪点
  • 左上角固定标题区:竖排小字栏目名 + 双行撞色主标题 + 手绘波浪下划线 + 副标语
  • 右侧固定人物(占画面约 1/3):Q 版少年角色,每篇用不同的「职业角色扮演」动作,表情也每篇换一种(不能张张都是同一副笑脸)
  • 其余区域铺满约 18~22 个内容元素:终端窗口、代码芯片、知识贴纸卡、爆炸星气泡、流程条、对勾清单……元素里装的都是文章里的真实代码和知识点,元素之间用彩色箭头关联

一句话概括设计哲学:信息密度,而不是装饰密度。每张图都像一张「可以读的笔记」,而不是一张「好看的插画」。

二、开始前需要准备的东西#

1. 素材(参考图)#

素材作用本地路径
角色参考图锁定人物形象参考图片/微信图片_20260923155825_96_4.jpg
风格参考图 1学密度和气质(不照搬版式)同目录 details-api-security-practices.8ZIhxhkz_Z2dpXoF.webp
风格参考图 2(可选)备用密度参考同目录 details-web-performance-optimization.B8Z6Zq9y_qDsv0.webp

参考图目录:C:/Users/dumplingandcake/Downloads/Google Chrome/参考图片/

注意:风格参考图只用来学「信息密度和黑板手绘气质」,提示词里必须明确「不要照搬参考图的版式」,否则会生成一堆一模一样的构图。

2. 工具#

  • 图像生成工具:任何支持「多参考图输入 + 高保真」的文生图模型(本项目用的是 ImageGen)。关键参数:
    • 尺寸:1536x1024(横版 16:9,博客卡片移动端裁成 2:1 也够用)
    • 质量:high
    • 输入保真度:high(保证角色形象不走样)
    • image1 = 角色参考图,image2 = 风格参考图
    • 修字时也要带 size=1536x1024(见第九节第一大坑)
  • 图像处理:Python + Pillow(去水印、修字、底色校准用)
  • 读图核对能力:智能体需要能查看生成的图片逐项核对文字(不支持的话就人工检查)

3. 博客工程约定#

  • Astro 博客项目:E:/GithubProgect/MyRunProject/dumplingandcakeblog
  • 封面存放:public/assets/images/posts/
  • frontmatter 写法:image: /assets/images/posts/xxx.png(纯字符串公开路径,不是相对路径)

三、设计规范(硬性规定,不可违反)#

这些是整个系统的「宪法」,提示词模板里每一条都必须体现:

  1. 底色统一:灰黑炭笔黑板,目标色 #26282B 附近,不发绿;擦痕 + 暗角 + 噪点;整个系列底色必须一致(生成后可做中位色校准)
  2. 布局固定:标题区永远在左上角;人物永远在右侧,约占 1/3 画面——这样系列整体才协调
  3. 角色锁定:Q 版少年,黑色蓬松长发、蓝色眼眸、耳坠、浅蓝色汉风长袍、黑色内搭、黑色长裤短靴;禁止猫耳猫娘(模型很爱加,必须显式禁止)
  4. 三无:无右下角圆形印章(早期版本有「第N课」印章,太丑已废)、无水印、无错别字
  5. 丰富度:每张 18~22 个内容元素,元素装真实信息(真实代码、工具名、参数、运行结果),元素间用箭头关联,大小错落、微微倾斜、部分重叠
  6. 每篇唯一:中央主图、人物动作、人物表情、主色四个变量每篇都不同,且必须贴合文章内容

    「人物表情」是 v3 补上的第四个变量。1~68 张的实战教训:人物的眼睛/眉毛/嘴形几乎是同一套(眼神平稳 + 嘴角上扬),单张看着没问题,十几张连着翻就像复制粘贴。表情必须在提示词里显式写死,否则模型一定滑回默认笑脸(见第四节「表情池」)。

  7. 安全区(重要,后期补充):所有元素必须完整落在画面内,四周各留约 6% 纯背景边距,任何元素不得贴边、不得被裁切;重要文字集中在纵向 12%~88% 的中间带。

    这条是踩坑后加的:博客卡片在移动端会按 2:1 裁切,早期没有安全区约束时,右下角的元素经常被切掉一半。 v4 修正:早期版本还要求「右下角 8%×8% 只留背景擦痕」——实测模型会把这句渲染成一块硬边空白矩形或纯黑方块(JavaWeb 批次 67/113 中招)。已废除。正确写法是「画面内容自然延伸到四个角落 + 显式禁止空白矩形/纯色方块」。

元素词库(从词库里挑 18~22 个填满画面)#

元素类型数量要求
粉笔终端窗口2~3 个装文章里的真实输入输出
爆炸星形气泡2~3 个写口号/关键词
漂浮代码芯片6~10 个每片带真实代码或结果
图标流程条4~5 站用黄色箭头串联
知识贴纸卡3~4 张不同颜色,写知识点
对勾清单2~3 条蓝框 + 对勾
中央主图1 个每篇不同,与人物互动
人物表情1 个每篇不同,按文章气质从「表情池」里选(见第四节)
涂鸦 + 关联箭头若干小蛇、星星等点缀

四、完整提示词模板(核心资产)#

模板骨架如下,{花括号} 里的变量每篇替换。前缀「高密度拼贴{编号}」很重要:生成工具常用 prompt 前若干字做文件名,前缀互不相同可避免同批文件互相覆盖。

高密度拼贴{编号}{短名}封面。技术博客封面:灰黑炭笔黑板底(约#26282B,灰黑不发绿),
带粉笔擦痕、四周暗角、颗粒噪点;信息密度极高,像贴纸拼贴一样铺满约二十个内容元素,
元素微微倾斜、大小错落、部分重叠,相关元素用彩色粉笔箭头连接;整张图不要任何圆形印章。
所有英文代码必须逐字母拼写正确。
【安全区约束·必须遵守】所有元素必须完整落在画面内,四周各留出约 6% 的纯背景边距,
任何元素不得贴边、不得被裁切;重要文字集中在纵向 12%~88% 的中间带,避免贴上下边缘(卡片会按 2:1 裁切);
画面构图完整自然,黑板和粉笔内容一直延伸到四条边和四个角落(四角可以是被自然裁切的涂鸦、便签一角或黑板擦痕纹理),
绝对不要出现任何空白矩形、白纸张、纯色方块、黑色矩形补丁或大面积留白区域。
主角完全保持图1中的Q版少年形象:黑色蓬松长发、蓝色眼眸、耳坠、浅蓝色汉风长袍、
黑色内搭、黑色长裤短靴,不要猫耳不要猫娘;人物在右侧约占三分之一、比例大,
动作是{人物角色扮演}:{具体动作描述,含互动元素上的文字};
表情是{表情名}(眼睛{形状}、眉毛{状态}、嘴{形状}),{表情符号道具},
不要微笑、不要用默认的平静神态;镜头{正面半身 / 侧身过肩 / 俯视工作台}。
标题区固定左上角:竖排小字「Python 学习笔记 · {编号}」,主标题两行:
白色粗粉笔大字「Python3」与{主色}色更大粗体字「{篇名}」,手绘波浪下划线,
{主色}色小字副标「{副标语}」。
标题下横向图标流程条{4或5}站用黄色箭头串联:{图标1}「{站1}」、{图标2}「{站2}」、…。
其余位置密集散布:
- 两个粉笔终端窗口:{终端1输入输出};{终端2输入输出}
- 三个爆炸星形气泡分别写「{口号1}」「{口号2}」「{口号3}」
- 八个漂浮代码芯片写「{芯片1}」「{芯片2}」…(每片带真实代码/结果)
- 三张知识贴纸卡:{色}卡写「{内容}」、{色}卡写「{内容}」、{色}卡写「{内容}」
- {中央主图描述:与人物互动、含具体文字}
- 两条蓝框对勾清单写「{要点1}」「{要点2}」
- 涂鸦:小蛇、{主题涂鸦}、星星、{点缀}
- 若干彩色关联箭头
所有文字清晰、正确、无错别字,不要水印、签名、logo。横版16:9。

变量怎么填:从文章内容提炼四个核心变量#

这是整个系统里最需要「动脑」的部分,智能体必须先读完全文再设计:

  1. 人物动作 = 文章主题的职业隐喻。把文章的知识点想象成一门手艺,让角色扮演这门手艺的从业者。例如:讲缩进语法 → 砌墙工匠(缩进就是砖);讲数据类型 → 分拣员(把值投进不同类型的抽屉);讲列表 → 列车调度员(车厢串联就是 append);讲注释 → 校对员;讲元组 → 保险柜管理员(不可变 = 上锁);讲 class → 月饼模具师傅(模具压出实例)。
  2. 人物表情 = 按文章气质从表情池里挑一个,且相邻篇不重复(v3 新增)。判断这篇是「顺手 / 卡壳 / 惊喜 / 成果 / 踩坑」哪一类,再从下表选;必须写进提示词,只写「开心地打磨」无效。
  3. 中央主图 = 文章核心概念的视觉化,并且要和人物动作有互动。例如:解释器那篇,人物是调度员,中央主图是「双终端对比」(交互式 vs 脚本式),人物举着两个车厢。
  4. 主色 = 每篇换一个,且和主题有弱关联(终端绿、粉蓝、暖橙、亮黄……)。撞色规则:主标题第一行永远白色「Python3」,第二行用主色,视觉上形成系列感 + 每篇差异。

表情池(写提示词时按三段式描述:眼睛 / 眉毛 / 嘴 + 一个符号道具)#

文章气质可用表情
顺畅、介绍性从容(闭眼微笑、单手背身)· 胸有成竹(挑眉、微微点头)· 沉思(手托下巴、眼神飘向斜上方 + 省略号)
卡壳、排错、硬核专注(眉头微皱、抿嘴、眼神紧盯)· 吃力(龇牙、额头汗滴、身体后倾)· 紧张(嘴角下压、僵住)· 无奈(扶额、半垂眼 + 省略号)
惊喜、发现、新特性疑惑(歪头、单眉上挑 + 问号)· 恍然(睁大眼、张嘴 + 惊叹号)· 兴奋(星星眼、露齿笑、双拳握紧)
成果、系统、实战得意(嘴角上挑坏笑、半闭眼、抱臂)· 惊叹(瞪圆眼、双手举高)· 审视(眯眼、放大镜反光)
踩坑、吐槽、警告无奈(扶额)· 后怕(汗滴、嘴角抽动)· 吐槽(嘴角一撇、翻白眼)

表情使用规则:

  • 提示词里必须出现三段式描述 + 一句「不要微笑、不要用默认的平静神态」;建议再补一个表情符号道具(汗滴 / 惊叹号 / 问号 / 省略号 / 星星眼 / 脸颊红晕)强化,模型对具体符号的响应比抽象情绪词稳。
  • 相邻两篇不能落同一行(同一气质类),同一表情整批里最多用 2 次。
  • 可以顺带变化姿态与景别(正面半身 / 侧身过肩 / 俯视工作台 / 只露上半身),进一步拉开差异。
  • 边界:只能变表情、姿态、镜头;人物设定(五官、发型、服装、画风)一律不能变,否则系列感就散了。
  • 一批跑完后回头扫一眼缩略图,如果人物的脸看着像复制粘贴,就是表情变量没生效,返工那几张。

其余变量(终端内容、芯片代码、贴纸卡、清单)直接从文章里抄真实代码和结论,这是「信息密度」的来源。

五、1~50 篇变量速查表(续作禁止复用已用组合)#

第 1~10 篇#

篇篇名/副标人物动作中央主图主色
01简介/新手友好的编程入门导游推开拱门(门楣 Python 3.13)发光拱门青蓝
02基础语法/缩进就是语法砌墙工匠砌缩进阶梯墙if/else 砖墙青绿
03基本数据类型/6 种标准数据类型分拣员投包裹进抽屉六层抽屉柜橙黄
04编程第一步/你的第一个程序按红色发射按钮发射台+Hello world 礼花暖橙
05解释器/交互式 vs 脚本式调度员举双车厢双终端对比终端绿
06注释/代码也要会说话校对员举放大镜圈注代码块亮黄
07运算符/八大类运算符速查杂技抛接符号+转卡盘八分环形卡盘琥珀黄
08数字/int float complex魔术师帽中变 π魔术帽+星点橙
09字符串/文本就是一切织布工拉字符布带Hello 布带+剪刀亮绿
10列表/最常用的数据类型调度员推 2001 车厢轨道列车粉蓝

第 11~22 篇#

篇篇名人物动作中央主图主色
11元组博物馆封印管理员给括号保险柜上锁玻璃罩封印+Immutable 封条紫罗兰
12字典钥匙管家举挂满 key 牌的木板花括号书架 key玫红
13集合派对门卫拦住重复的 apple韦恩图 a & b钴蓝
14容器对比评委举记分牌指领奖台五容器三台阶领奖台香槟金
15类型转换海关兑换员举 int/float/str 徽章牌type() 漏斗兑换机薄荷青
16条件控制铁路扳道工握岔道杆if/elif/else 三向岔路口珊瑚橙
17循环语句摩天轮操作员拉控制杆while True 循环圆环四站靛青
18推导式甜品师端烤盘撒糖粉饼干模具压印机 1→2,4,6,8,10柠檬黄
19迭代器与生成器传送带巡检员只放行一个包裹长传送带 + next() 收集篮蔚蓝
20函数基础咖啡师按咖啡机按钮def 咖啡机参数进出 返回值橄榄绿
21函数进阶俄罗斯套娃工匠开三层套娃三层套娃 f(x)/g(x)/h(x)酒红
22类型注解行李贴标签员用标签枪打标签三只行李箱 int/str/list石板青

第 23~29 篇#

篇篇名人物动作中央主图主色
23模块与包模块仓库管理员抽 random 盒八格模块货架青柠绿
24面向对象基础月饼模具师傅压 class 模具模具压出挖掘机/混凝土车/工人月饼焦糖棕
25异常处理杂技安全网架设员接 Error 方块try 护罩+except 网+finally 垫正红
26with 关键字自动门管理员按 with 感应钮__enter__/__exit__ 自动门青碧
27AI大模型讲解员教鞭指同心圆AI⊃LLM⊃AI应用 三层同心圆电光紫
28大模型部署运维举天平称显卡与云朵本地/API/云 三机柜深钢蓝
29网络基础投递员投包裹进 DNS 翻译机DNS 翻译机+楼层门牌 :443湖蓝

第 30~36 篇#

篇篇名人物动作中央主图主色
30HTTP 协议快递收发员按门铃递包裹请求/响应传送带赭石橙
31JSON翻译官对照 dict 与 JSONdict 与 JSON 对照台草绿
32Apifox 调试三钥匙开门人开 API 门三钥匙+调试面板品红
33OpenAI SDK信使投 client 邮箱进云端client 邮箱→DeepSeek 云天青蓝
34提示词工程调音师旋六要素旋钮六要素旋钮台葡萄紫
35Streamlit搭建师拼 pip/import/run 积木积木塔蜜桃粉
36找学习伙伴店员摆聊天面板骨架聊天面板骨架松石绿

第 37~50 篇#

篇篇名人物动作中央主图主色
37流式输出打字机排字工按红色按钮吐字符方块的打字机管道天青蓝
38会话记忆档案管理员插「上一轮对话」纸条messages 记忆档案柜砖红
39文件操作图书管理员拉抽屉抽 read() 文稿r/w/a 三抽屉文件柜牛皮黄
40时间与os钟表匠托齿轮座钟拨指针座钟+日历 2026-09-23+目录树青铜绿
41会话管理书架管理员挂「新对话」会话夹四块会话夹木书架紫红
42网络机器人机器人训练员牵蜘蛛机器人蜘蛛机器人趴 HTML 网图纸铁灰蓝
43requests信使按 GET 钮投请求信封req→服务器→res 200 管道橘红
44网页结构装修监理举 HTML 图纸刷漆HTML/CSS/JS 三层小楼剖面琥珀橙
45网页解析矿工投标签石头进破碎机lxml 破碎机吐数据金块孔雀蓝
46Xpath语法寻宝导航员罗盘指标签树高亮 //div/p[2] 路径的标签树青莲紫
47CSV文件操作制表员推表格进文件箱姓名/年龄/性别/爱好 表格草绿
48正则入门安检员放大镜扫文字带红圈标手机号的扫描传送带藤黄
49正则语法密码破译员扳 {4} 卡口旋钮数字方块流水线宝蓝
50电影榜单爬取放映员摇放映机投数据卡胶片滚电影卡流进 csv 箱赭红

续作第 51 篇及以后:禁止复用上表的动作/主图/主色组合,按同样的「职业隐喻」方法从新文章里重新设计。

关于表情:150 篇(以及 5168 篇)出图时规范里还没有「表情」这个变量,所以本表没有表情列,这批封面的表情也基本是同一副。续作不必去补记历史表情,只需要从第 69 篇起按第四节的表情池轮换(相邻不重复、同表情整批最多 2 次)即可。

六、完整生成流程(交给智能体的操作步骤)#

第 1 步:读文章#

打开 src/content/posts/编程学习/Python学习笔记/{NN}-{篇名}.md,通读全文,提炼:核心概念、真实代码片段、运行结果、知识点清单。

第 2 步:设计变量#

按第四节的方法论,确定人物动作、人物表情、中央主图、主色,以及终端窗口内容、代码芯片文案、贴纸卡、清单条目。先想清楚再生成,不要边生成边改。

表情先定、再写动作:先判断文章气质 → 挑一个和上一篇不同类的表情 → 把它写成「眼睛/眉毛/嘴 + 符号道具」再动笔。反过来做(先写动作、指望模型自己配表情)一定拿回同一张笑脸。

效率技巧:文案先精简再入 prompt。写进提示词的文字越短越少,模型出错越少——实际经验是「精简文案一次成型」比「写满再修」快得多。

第 3 步:填模板生成#

把变量填进模板骨架,调用图像生成工具:

  • image1 = 角色参考图
  • image2 = 风格参考图(details-api-security-practices 那张)
  • size = 1536x1024,quality = high,input_fidelity = high
  • output_dir = 临时目录(如 covers_NN_MM/),最后统一去水印落盘

第 4 步:读图核对(必做!)#

模型生成中文文字的错字率不低,必须逐项放大核对每个文字元素。实际踩过的雷:「面向对象编程」写成「对向全面编程」、「斐波那契」写成「斐波弼契」、「Tuple」写成「Tuble」、「#!/usr/bin/env」写成「#!/usr/din/env」、os.getcwd() 写成 os.getcwd、strftime 写成 strflist、User-Agent 写成 User-Ac-Agent……另外「精确数字序列」「固定数量的卡片」这类要求模型经常执行不到位,靠核对兜底。

顺带一项只看脸、不用逐字的检查:这张的表情是不是和上一篇撞了。撞了就重出(表情没法用 PIL 修),别留到整批跑完才发现。若批量任务明确要求「直出不核对」(本项目 2026-09-23 起的偏好),至少把这一项留着。

第 5 步:修字(AI 短指令 + PIL 精修两步走)#

第一优先:AI 单点修字。 image1 = 有错字的成图,prompt 只写「把某处的 XX 改成 YY,其他一切保持原样」。

  • 每轮只给 2~3 处短指令,给 5 处以上常会漏执行
  • 最多两轮:小字密集区常整轮无效(原样重绘)。第二轮仍失败就立刻转 PIL,别耗轮次
  • 务必带 size=1536x1024,否则输出 1024×1024 方图,没法裁回 16:9

第二步:PIL 精修(AI 反复修不好的顽固错字)。

  • 坐标必须实测:先用 20px 细网格 + 35 倍放大图确认精确坐标。目测整图缩略图必偏 1030px
  • 擦除:用「暗色像素中位色 + 随机噪点(±5)」填充;浅色卡(粉卡/黄卡)不能用中位色采样(会涂黑),要用已知卡底色
  • 重写:msyhbd.ttc 字体 + 与原图一致的字号(先量原字号,写大了会溢出)+ GaussianBlur(0.5) 柔化
  • 旋转芯片:用「多边形 quad 填充 + 旋转图层 paste 文字」,注意 paste 坐标要下移补偿
  • 擦掉整个元素(多余窗口、气泡):用 synth_fill(低频明暗波动 + 细噪点合成黑板质感),不要克隆——源区几乎必撞内容

第 6 步:去水印#

生成图右下角常带半透明水印(本项目位置约 x1336-1525 / y944-1013)。用第七节的 Pillow 脚本处理。

第 7 步(可选):底色校准#

同批封面底色如有偏差,取图中「绿色调的中亮度像素」的中位数,逐通道增益校准(增益限制在 0.82~1.25 防止翻车)。

第 8 步:落盘 + frontmatter#

覆盖成正式文件名 python-NN-{短名}.png,确认文章 frontmatter 里有:

image: /assets/images/posts/python-NN-xxx.png

批量写 frontmatter 的脚本逻辑:读 md,若首段已有 image: 就 re.sub 替换,否则在 order: 行前插入。

七、去水印脚本(Pillow,可直接复用)#

原理:水印是「低饱和度的高亮区域」,先用阈值把它抠出来做掩码,膨胀一圈,再用周边深色像素的中位色 + 随机噪点填充——这样补出来的区域有噪点质感,能融入黑板底色。

踩坑提醒:不要用「整块克隆」或「按列克隆」来补水印区域。前者会把人物长袍、桌沿复制过去;后者在邻域有彩色涂鸦时会产生斜纹伪影。中位色 + 噪点是验证过的最优解。

from PIL import Image, ImageFilter
import random
def remove_watermark(path, box, out_path,
lum_thresh=100, sat_thresh=90,
dilate=7, noise=7):
"""
path: 输入图片
box: 水印区域 (x1, y1, x2, y2),本系列约 (1336, 944, 1525, 1013)
"""
img = Image.open(path).convert("RGB")
px = img.load()
w, h = img.size
# 1. 掩码:低饱和 + 高亮的像素(水印特征)
mask = Image.new("L", (w, h), 0)
mpx = mask.load()
for y in range(box[1], box[3]):
for x in range(box[0], box[2]):
r, g, b = px[x, y]
lum = 0.299 * r + 0.587 * g + 0.114 * b
sat = max(r, g, b) - min(r, g, b)
if lum > lum_thresh and sat < sat_thresh:
mpx[x, y] = 255
# 2. 膨胀:把水印边缘也盖住
mask = mask.filter(ImageFilter.MaxFilter(dilate))
mpx = mask.load()
# 3. 采样掩码周边的深色像素(黑板底色)
samples = []
for y in range(box[1] - 10, box[3] + 10):
for x in range(box[0] - 10, box[2] + 10):
if 0 <= x < w and 0 <= y < h and mpx[x, y] == 0:
r, g, b = px[x, y]
if 0.299 * r + 0.587 * g + 0.114 * b < 80: # 深色
samples.append((r, g, b))
if not samples:
samples = [(38, 40, 43)] # #26282B 兜底
samples.sort()
med = samples[len(samples) // 2] # 中位色
# 4. 用中位色 + 随机噪点填充掩码区域
for y in range(box[1], box[3]):
for x in range(box[0], box[2]):
if mpx[x, y] > 0:
n = random.randint(-noise, noise)
px[x, y] = tuple(
max(0, min(255, c + n)) for c in med
)
img.save(out_path)
print("done:", out_path)
remove_watermark(
"input.png",
(1336, 944, 1525, 1013),
"output.png",
)

八、PIL 精修工具函数(擦除 + 重写)#

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
FONT = "C:/Windows/Fonts/msyhbd.ttc"
def fill_soft(im, box, feather=8, noise=7):
"""中位色 + 噪点 + 羽化边,擦除错字(适用于黑板底/深色底)"""
l, t, r, b = box
px = [im.getpixel((x, y)) for y in range(t, b, 2) for x in range(l, r, 2)]
med = tuple(sorted(c[i] for c in px)[len(px) // 2] for i in range(3))
w, h = r - l, b - t
layer = Image.new("RGB", (w, h))
d = ImageDraw.Draw(layer)
for y in range(h):
for x in range(w):
n = random.randint(-noise, noise)
d.point((x, y), fill=tuple(max(0, min(255, med[i] + n)) for i in range(3)))
mask = Image.new("L", (w, h), 255)
md = ImageDraw.Draw(mask)
for i in range(feather): # 羽化边,避免生硬方块
md.rectangle([i, i, w - 1 - i, h - 1 - i], outline=int(255 * i / feather))
im.paste(layer, (l, t), mask)
def synth_fill(im, box, feather=16):
"""合成黑板质感填充(低频明暗波动 + 细噪点),擦掉整个元素时用这个"""
l, t, r, b = box
w, h = r - l, b - t
px = [im.getpixel((x, y)) for y in range(t, b, 2) for x in range(l, r, 2)]
med = tuple(sorted(c[i] for c in px)[len(px) // 2] for i in range(3))
random.seed(42)
low = Image.new("L", (13, 13))
low.putdata([random.randint(0, 255) for _ in range(169)])
low = low.resize((w, h), Image.BICUBIC).filter(ImageFilter.GaussianBlur(2)) # 低频波动
lowpx = low.load()
layer = Image.new("RGB", (w, h))
d = ImageDraw.Draw(layer)
for y in range(h):
for x in range(w):
k = (lowpx[x, y] - 128) / 128 * 12 # 明暗起伏
n = random.randint(-7, 7) # 细噪点
d.point((x, y), fill=tuple(max(0, min(255, int(med[i] + k + n))) for i in range(3)))
mask = Image.new("L", (w, h), 255)
md = ImageDraw.Draw(mask)
for i in range(feather):
md.rectangle([i, i, w - 1 - i, h - 1 - i], outline=int(255 * i / feather))
im.paste(layer, (l, t), mask)
def write(im, xy, text, size, color=(240, 240, 240), anchor="mm"):
"""按原字号重写文字(size 必须先量原图字号,写大了会溢出)"""
f = ImageFont.truetype(FONT, size)
layer = Image.new("RGBA", im.size, (0, 0, 0, 0))
ImageDraw.Draw(layer).text(xy, text, font=f, fill=color, anchor=anchor)
layer = layer.filter(ImageFilter.GaussianBlur(0.5))
im.paste(layer, (0, 0), layer)

生成坐标验证图(修字前必做):

from PIL import Image, ImageDraw
im = Image.open("p45.png").convert("RGB")
box = (330, 600, 660, 720) # 待修区域
c = im.crop(box).copy()
c = c.resize((c.width * 3, c.height * 3), Image.LANCZOS)
d = ImageDraw.Draw(c)
ox, oy = box[0], box[1]
for x in range(0, c.width, 15): # 每 5px 一条细线
X = ox + x // 3
d.line([(x, 0), (x, c.height)], fill=(255, 0, 255) if X % 50 == 0 else (140, 70, 140))
if X % 50 == 0: d.text((x + 2, 2), str(X), fill=(255, 0, 255))
for y in range(0, c.height, 15):
Y = oy + y // 3
d.line([(0, y), (c.width, y)], fill=(0, 255, 255) if Y % 50 == 0 else (60, 120, 120))
if Y % 50 == 0: d.text((2, y + 2), str(Y), fill=(0, 255, 255))
c.save("verify_zoom.png")

九、已知坑清单(血泪教训)#

坑现象对策
修字漏传尺寸image-to-image 输出 1024×1024 方图,无法裁回 16:9修字也必须带 size=1536x1024(44~50 批踩过,整批返工)
AI 修字整轮无效小字密集区原样重绘,白跑一轮每轮只给 2~3 处;最多两轮,不行立刻转 PIL
PIL 坐标靠目测擦错位置、字号写太大溢出先用 20px 细网格 3~5 倍放大图实测坐标与字号
克隆填充撞内容源区正好是人物袍子/标题大字,贴过去一片残影改用 synth_fill 合成黑板质感(曾连撞三轮)
浅色卡被擦黑粉卡/黄卡用中位色采样 → 涂成深色浅色卡用已知卡底色填充,不要采样
擦坏区域误擦了好内容从同画面初版原图复制对应 patch 贴回
边框白缝误判缩略图上把边框白色缝线当成残字,越擦越糟先放大 5 倍确认,是缝线就别动
并行生成 output_dir 失效同一条消息里并行调多次生成,只有最后一个 output_dir 生效串行调用,或每张用不同 output_dir
文件名冲突文件名 = prompt 前 30 字,前缀相同会互相覆盖prompt 以「高密度拼贴NN」开头,天然防冲突
猫耳猫娘模型自发给角色加猫耳提示词里显式写「不要猫耳不要猫娘」
人物表情雷同十几张连着翻,人物的眼眉嘴一模一样,像复制粘贴;单张看不出来表情作为第四个必变变量写进提示词(三段式 + 符号道具 + 「不要微笑」),按气质选、相邻不重复(见第四节表情池)
版式照搬参考图生成结果和参考博客封面一模一样提示词里明确「只学密度气质,版式按本文模板」
文字错字/漏字中文、代码、专业名词高频出错生成后逐项核对 + 修字流程
数量执行不准「八个芯片」可能只出五个,「4 站流程条」可能变 6 站核对时容忍 ±2,只要整体密度达标
底色漂移有的张数偏绿统一写死「#26282B 灰黑不发绿」+ 后处理中位色校准
印章回潮早期模板有「第N课」印章,模型偶尔又画出来提示词写「不要任何圆形印章」
元素贴边被裁右下角元素被卡片 2:1 裁切切掉提示词加【安全区约束】(见第三节第 7 条)
右下角空白矩形提示词写「右下角 8%×8% 净空」,模型把它渲染成硬边空白矩形/纯黑方块(JavaWeb 批次 67/113 中招)废除净空约束,改为「画面延伸到四角 + 绝对不要空白矩形/纯色方块」(v4)
像素级修复越修越糟inpaint/克隆/高低频分离修角区,修完纹理不搭、有残影封面出问题一律整张重新生成,不做像素级修复(用户铁律,2026-09-30)
反复修到崩一张图像素级修补 5 轮后画面破损错字超过 6~8 处,直接整张重生成,别在原图反复动刀

十、给其他智能体的一页纸速查#

如果你是一个拿到这篇文章的 AI 智能体,请按这个顺序执行:

  1. 读本文第三节「设计规范」和第四节「提示词模板」——规范是硬性的,模板是骨架
  2. 读目标文章全文,按「职业隐喻法」设计人物动作、人物表情、中央主图、主色,禁止复用第五节省略表里的组合,也禁止连续两篇用同一类表情
  3. 从文章里抄真实代码和结论填满终端窗口、代码芯片、贴纸卡、清单;文案尽量精简
  4. 用 image1=角色图、image2=风格图、size=1536x1024、quality=high、input_fidelity=high 生成
  5. 逐项核对文字:错字先 AI 单点修(每轮 2~3 处、最多两轮、带尺寸),修不掉转 PIL 精修(网格实测坐标)
  6. 错误太多(>6 处)就整张重生成,不要硬修
  7. 有水印就跑第七节脚本;底色偏了做中位色校准
  8. 落盘到 public/assets/images/posts/python-NN-xxx.png,确认 frontmatter 的 image 字段
  9. 避开第九节的所有坑

做到这些,生成出来的封面就会和本系列保持同一套视觉系统:一样的灰黑黑板、一样的左上标题、一样的右侧少年、一样的信息密度,但每一张的主图、动作、颜色和神态都在讲它自己那篇文章的故事。


本文是《Python 学习笔记》封面工程的完整存档(v3,截至第 68 篇 + 《羊毛分享》2 篇)。方法论可迁移:把「Python 学习笔记」换成任何专栏名,把角色参考图换成你自己的形象,剩下的骨架原样可用。

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]