AgentMarketMCP / SKILL 资产档案馆

目录 / imagegen-batch

SKILL 未评级 已上架

imagegen-batch

--- name: imagegen-batch description: > 用 ImageGen 等文生图工具安全地批量生成多张图片,避免并行同名覆盖,并规范命名归档。 当用户需要一次生成 2 张以上图片、批量配图/插图、封面+多张内图、同风格系列图时使用。 核心规则:提示词开头加唯一前缀防覆盖、量水印优先 --auto-crop 自动量测、生成后 mv 重命名并写 manifest、交付前数量核对+裁水印。 留白相框属**可选项**,默认不做,仅当用户明确要求「留白边 / 相框感」时才加; 人物给足标识包防塌脸、批量默认顺序发、失败按 5/15/45s 退避重发、单张重出默认最多 4 版(用户可指定)。 version: 1.5.1 python: [PIL] --- - **Version**: 1.5.1 - **License**: MIT - **Author**: Evan Song · [github.com/Songhonglei](https://github.com/Songhonglei) - **Repository**: https://github.com/Songhonglei/better-office-work/tree/main/skills/imagegen-batch # ImageGen 批量生图(防覆盖 + 避让水印 + 规范归档) 一次生成多张同风格图,最怕三件事:**文件互相覆盖、水印留在画面上、人物塌成同一张脸**。 本 skill 把这三件事的处理顺序和判断标准固定下来——先防覆盖,再避水印,最后才谈画面好不好看。 > 版本历史见 [CHANGELOG.md](./CHANGELOG.md)。 ## 何时用 一次生成 2 张以上图片,尤其同风格系列图(公众号封面+配图、正文插图、卡片等)。 ## 依赖 只依赖 **Pillow**(`scripts/add_frame.py` 裁水印 / 加框用),无 Node、无浏览器、无第三方服务: ```bash python3 -c "import PIL" 2>/dev/null || python3 -m pip install -q Pillow ``` ## 工具的已知行为(用前必看) | 行为 | 现状 | 应对 | |---|---|---| | `output_dir` 是否生效 | **生效**(2026-11-09 实测:指定后文件确实落在指定目录,默认目录 0 文件)。旧版曾忽略,不排除回归 | 仍要 `ls` 复核;没落进去就从默认目录(`generated-images/`)捡 | | 文件名 = prompt **前 30 字符** + `_YYYY-MM-DDTHH-MM-SS` | 秒级时间戳 → 同前缀 + 同一秒 = 同名覆盖、静默丢图 | 唯一标记必须落在**前 30 字内**;这是唯一能防住落盘覆盖的手段 | | `size` 非标准比例被归一化 | 仍存在,但落点变了:请求 `1536x654`(2.354)→ 实出 **`1536x640`(2.4:1)**,不再是旧文档写的 1408x704(2:1)。归一化目标随请求变,别指望命中精确比例 | 要精确比例就生成后裁:`add_frame.py --ratio 2.35`,或 `sips -z 383 900` 缩到微信标准 | > 微信头条封面标准 900x383(2.35:1),次条 200x200(1:1)。 ## 生成前:提示词规范(防覆盖 + 避让水印) ### ① 开头加唯一前缀(防同名覆盖) 文件名前缀只取 prompt **前 30 个字符**,所以唯一标记必须落在前 30 字内: - 用场景词开头:「市井八仙。」「天庭道观对比。」「凡人互助。」;或「图01」「图02」(模型通常忽略这类标签,不会画进画面)。 - 只有前 30 字不同,同秒并发才不会同名覆盖。**run 目录防不住工具落盘那一刻的覆盖**,别指望它兜这个。前缀成本为零,永远加。 ### ② 右下角留白(避让 AI 水印) AI 水印固定在右下角,且用户会裁掉它。所以 prompt 里必须明确: - **右下角留白**,不放任何重要元素(印章、主体、文字、关键细节)。 - 印章 / 朱砂红点缀统一放**左下角**或画面左侧,不要放右下角。 - 可在 prompt 追加一句:「右下角留白,不放置任何元素」。 - 效果:裁掉右下角水印时,不损失任何画面内容。 > ⚠️ **但模型经常不守这条(2026-09-26 实测)**:一批 4 张 1536x1024 的插图,prompt 里明确写了「右下角大面积留白」,结果 4 张的右下角**全都有内容**(墙面、地面、桌角、纯黑)。**不要假设留白指令生效**,必须走下面的「裁掉右下角水印」流程,不要凭感觉裁。上面这条只能提高「裁掉不心疼」的概率,不是保证。 ### ③ 提示词直接写中文,不要用 `\uXXXX` 转义拼 **2026-10-06 实测**:用 Unicode 转义拼中文 prompt,转义表极易写错,实际发出去的是**形近/同音错字**—— 本次真实发生三处:`修葺`→`修荠`、`垛口`→`垆口`、`下颌`→`下顸`。模型靠上下文猜对了,画面没坏, 但**这是在赌**:错字恰好落在关键名词上(如"夯土"写成"芬土"、"垛口"写成别的)就会直接画错。 规则:prompt 一律直接写中文,不做转义拼接。若不得不用转义,**发出去前先把 prompt 原样打印出来核对一遍**。 ### ④ 并发与 `ECONNRESET` **2026-10-06**:并行发 3–4 张,整批 `read ECONNRESET`(并行 4 张挂 1 张、并行 3 张全挂);改顺序发后 6 张全过。 **2026-11-09 复测没复现**:轻载 3 张(`512x512` low)、重载 3 张(`1536x1024` high,完成跨度 7s)都 3/3 成功。 → 这是连接被对端重置,不受本 skill 控制,随时可能回来。**顺序发仍是默认**,别因为这次没炸就拆兜底;「并行 4 张」那档没测。 > ⚠️ 一条消息里连发多个 ImageGen 调用**不会真并行**(实测落地间隔 9s、8s,实际串行);要真并发只能靠多子任务 / 多会话。所以「我一次发了 3 个」不算压测。 **失败重发(本节是唯一定义处,别在别处另写一套)**: 1. 先 `ls` 目标目录——文件数涨了就是已落盘,直接归档,别重发。 2. 没落盘就 **prompt 一字不改**重发,间隔 **5s → 15s → 45s**,最多 3 次重试(连首次共 4 次)。 3. 3 次仍失败才允许换 prompt 或停下来报告;一次 `ECONNRESET` 不值得改词。 4. 只管「没落盘」;出图了但画面不达标走「重出图」,两者别混。 ### ⑤ 想把某物画小 / 画远,要改「形状」,不要只给「数值」 **2026-10-06 实测(《长城》配图 `03-界桩迟到` 重出)**:题材要一根「水泥界桩」在远景里只当个小物件。 连试三版,写了「非常小」「只占画面极小的一块」「高度不到画面高度的十五分之一 / 二十分之一」, 模型每次都画成**又高又窄的竖长方形**——读起来是块「无字碑」,跟题材要的「工程标志桩」正好相反。 第四版改法(生效),三条一起上: 1. **改形状比例**:「矮胖的方块墩子,高度跟宽度差不多,上边略窄、底盘略宽,顶上是一道斜切面」 ——把它从「石板」重新定义成「墩子」; 2. **给工程件特征**:「底部有一圈稍宽的水泥底座」——一眼能认出是标志桩而不是碑; 3. **写负面排除**:「绝不是竖长的长方形,也不是立起来的石板、不是石碑」。 规则:**尺度数值只在模型已经画对形状时才有效**。想把一个物件变小 / 变远,先去改它的**长宽比和部件**, 再用负面清单封死它最容易塌成的那个形状。同理,**材质也吃这一套**:只写「夯土筑的」它照画砖石砌缝, 要写「整道墙体是一体的夯土,从墙顶到墙根没有任何砖石码放的砌缝」才立得住(同轮实测)。 ### ⑥ 古代场景的人物,必须逐件钉「头」和「衣」,只写朝代名无效 **2026-10-25《众口铄金》实测**:prompt 里写了「东汉汝南」「明崇祯三年北京西市」,人物出来是**民国**—— 短发平头、立领长衫、西装领、纽扣。**白描线稿去掉色彩与纹样后,模型只剩一个默认朝代,而这个默认值是清末民初。** **人物越多越错**(5 人以上必错,且常出现三四个时代混搭)。 三条一起上才压得住:**① 头发写束法**(「束发挽成髻,用发带或巾包住」+ 负面「不是短发、平头、寸头」); **② 衣写形制**(「交领右衽、宽袖、腰系带、下摆及踝」+ 负面逐个点名「立领/翻领/衬衫领/纽扣/对襟短褂(马褂)/中山装」); **③ 人群写统一**(「所有人一律同一朝代装束,没有一个人例外」)。 背影图尤其要管后脑——**短发是一个光圆弧,束发是一个髻**。 各朝代发式/冠巾/衣装的对照表,见 `references/style-library.md` 的 `baimiao-ink` →「古代场景的人物造型(朝代锚点)」。 ## 生成后:落进 run 目录 + 写 manifest **一次批量 = 一个 run 目录**,目录名带时间戳 + 短 uuid,和上一批天然不撞。 ```bash RUN="output/$(date +%Y%m%d-%H%M%S)-$(python3 -c 'import uuid;print(uuid.uuid4().hex[:6])')__<主题>" mkdir -p "$RUN/_raw" # 生成时把 output_dir 指到 "$RUN/_raw",出图后 ls 复核: # 在 → 直接改名;不在 → 从 generated-images/ 捡回来 mv "$RUN/_raw/<工具原名>.png" "$RUN/00-守门.png" ``` **命名规范(不可省)**:`NN-<prompt摘要>.png` - `NN` 两位序号,按文章/画面顺序(00-封面、01-众生相…)。 - **`<prompt摘要>` 必须是中文可读的场景词,直接取该图 prompt 开头的 4–8 字**,如 `00-守门.png`、`01-书案台灯.png`。 **最终交付的文件名不许只留 uuid / 序号 / 时间戳**——run 目录负责「跟上一批不撞名」,文件名负责让人一眼看懂画的是什么。 - 取不到摘要就手写一句画面描述补上,别用 `image_01` 这类占位。 **manifest 每行记一张图**(append-only,断点续跑 / 复盘 / 补漏都靠它): ```python import json, datetime row = {"ts": datetime.datetime.now().isoformat(timespec="seconds"), "seq": 0, "src": "<原始文件名>.png", "dst": "00-守门.png", "prompt_summary": "守门", "size": "1408x704", "watermark_cropped": False, "note": ""} with open(f"{RUN}/manifest.jsonl", "a", encoding="utf-8") as f: f.write(json.dumps(row, ensure_ascii=False) + "\n") ``` - `prompt_summary` 与文件名里的摘要一致;`watermark_cropped` 裁完水印改 `true`(追加新行,别删历史行)。 - 带水印原图先留到 `$RUN/_raw/` 再裁;改白边 / 换比例只重跑脚本,不要重新生图。 - 同尺寸的水印 CUT 量一次就够,记进 manifest 的 `note`,其余图复用。 - 后面「交付前:数量核对」里的 `output/<run 目录>` 指的就是本次 run 目录。 ## 重出图:上限与兜底 **单张图默认最多出 4 版(含首版,即最多重出 3 次)。用户可指定「这轮最多 N 版」覆盖默认值**, N 为 ≥1 的整数;指定后以用户说的为准,不用再回来确认。 - 每一版重出前先写明「这一版要修哪一条」(形状 / 年代装束 / 构图 / 塌脸 / 水印可裁性), **不要拿同一条 prompt 反复抽卡**——抽卡不算重出,只会耗尽额度。 - 达标项尽量写成可核对的事实(「界桩是矮胖墩子,不是竖长石板」「所有人交领右衽,无立领纽扣」), 别用「感觉好一点了」当判定。 - **到上限仍不达标:交付这几版里最不坏的一版**,并附**未达标清单**(哪几条没满足、各版差异、 建议下一步是换机位还是换风格),不无限返工、也不静默当合格图交付。 - 这里管的是「出图了但画面不达标」;「没落盘」的失败重发走 ④,两者别混。 ## 交付前:数量核对 + 裁水印 ### 数量核对(兜底) ```bash ls output/<run 目录>/*.png | wc -l # 只数交付图,别把 _raw/ 和 manifest.jsonl 数进去 ``` 确认文件数 = 预期数再交付。发现少了就是被覆盖,立刻补生成缺失的。 ### 裁掉右下角水印 **先量,再裁——不要猜裁剪量。** 水印位置是固定的,量一次就能复用到同尺寸的所有图。 **优先用脚本自动量测(`--auto-crop`);只有自动量测没命中,才退回下面的人工主观判断。顺序不要反。** #### 主路径:`--auto-crop` 自动量测 ```bash S=scripts/add_frame.py python3 "$S" in.png out.png --auto-crop # 自动定位水印上沿 → 算 CUT → 裁 python3 "$S" in.png out.png --auto-crop --ratio 2.35 # 封面:自动裁水印 + 裁到 2.35:1 ``` 脚本在右下角区域内逐行算**相对背景的笔画梯度能量**(不是绝对暗像素阈值,浅色/半透明水印也能抓), 定位文字带上沿 y0,取 `CUT = h - y0 + 8px` 安全余量并 clamp 到合理区间。 命中时打印 `AUTO-CROP ... y0=... CUT=...`;**把这个 CUT 记进 manifest 的 `note`,同尺寸其余图直接复用**, 后续用 `--crop-bottom <CUT>` 即可,不必每张都重新量。 - **偏离熔断**:自动量到的 CUT 若超过该尺寸经验值 1.5 倍(右下角有墙面 / 桌角纹理时梯度会误报), 判为量测失败转 FALLBACK——宁可按经验值少裁,也不把画面内容当水印裁掉。 - `VERIFY` 仅作提示:纹理丰富的画面右下角本就有高亮跳变,会误报 `SUSPECT`,人工抽看一眼即可, 别据此反复加裁。 #### fallback:自动量测没命中时(必做,不是可选项) **测不到 ≠ 没有水印。** 脚本若打印 `FALLBACK`,说明右下角没有可识别的笔画带——极淡水印 (最小灰度 122–175、无成片深色笔画)会让剖面整段为 0,见下方 ⚠️ 实测。 此时脚本**仍会按尺寸经验值裁**(`1536x1024 → 80px`、`1408x704 → 70px`,其他尺寸按宽度外推), **绝不能因为「看起来干净」就跳过裁切**;裁完再退回以下人工主观判断复核: - **放大右下角 + 画坐标刻度**读出上沿,或直接用经验值 CUT; - **「`max` 突变到 250+」验真**:看交付图右下角 80x260 区域,若还有文字状笔画(亮度突变到 250+) 就是水印还在,加裁并复测;几张图的右下角拼成对照图一眼可确认。 - 若会话看不了图、无法自查,交付时明确提示用户确认。 **经验值(1536x1024 输出,实测 2026-09-26 / 2026-11-09 复测)** - 水印「AI生成 / WORKBUDDY」占 y≈953–1015、x≈1413–1521(宽约 110px,右边缘留 15px 余量)。 - 裁 80px(→1536x944)可干净去除;2026-11-09 那批自动量到上沿 y≈957、CUT 75 即干净,脚本仍保守取 80。 - **封面类横长图,纵向裁过就没水印**:1408x704 的水印约在 y≈650–704,保留底边 y<645 即安全。 - 副作用可接受:裁掉的是一条底边,构图损失很小;底部恰是重要内容时,可用 PIL 从水印上方同宽区域垂直复制一条贴上去,但只在背景均匀时用,否则有拼接痕迹。 **⚠️ 「暗像素剖面法」只在水印是深灰时有效(2026-10-17 实测)**:逐行统计灰度<110 的老办法,在《诺奖查证件》那批 6 张上整段为 0(右下角最小灰度仅 122–175、无成片深色笔画)——**这版水印极淡**。这正是 `--auto-crop` 改用梯度能量的原因,但极淡水印仍可能整段测不到,所以 **fallback 是强制路径,不是可选优化**。 ## 相框感(留白边框)—— 可选,默认不做 **默认不加框。** 留白是审美偏好、不是通用需求:每张都套一圈白边等于替用户做了决定,还会改成品尺寸(1536x944 → 1670x1078)。**只有用户明确说「要留白边 / 相框感 / 装裱感」时才加。** prompt 求不来(2026-09-26 实测:写着「四周留整圈空白」,4 张全是满构图),**只能后期加**。脚本 `scripts/add_frame.py` 默认只做裁切,加框必须显式 `--frame`;结构为 图像 → 白隙 gap →〔细线框 line,可选〕→ 外侧白边 pad。 | 参数 | 默认 | 说明 | |---|---|---| | `--auto-crop` | 关 | 自动量测水印上沿并裁底边;量不到时按尺寸经验值裁并打印 `FALLBACK`。与 `--crop-bottom` 互斥 | | `--frame` | 关 | **加框总开关。默认不加**,只有用户要求时才传 | | `--pad` | 0.06 | 外侧白边,取**短边**的比例;5%~6% 观感最好,再宽显空 | | `--gap` | 11 | 图像与线框之间的白隙(px);`--line 0` 时它就是图像到外沿的留白 | | `--line` | 3 | 线框粗细(px);**传 0 = 只留白边不画线**(推荐) | | `--crop-bottom` | 0 | 先裁掉底部 N px(已知 CUT 时用) | | `--ratio` | — | 目标比例,用二分 `fit_ratio()` 拟合;不加框时指图像本身,加框时指含框后的整体 | > **加框一律 `--line 0`(2026-09-26 用户拍板)**:线条画本身已有大量黑色轮廓,再叠一道画框线显得生硬;除非用户明确说要画框。 ```bash S=scripts/add_frame.py python3 "$S" in.png out.png --auto-crop # 默认:只裁水印 python3 "$S" in.png out.png --crop-bottom 80 --frame --line 0 # 用户要留白边 python3 "$S" in.png out.png --crop-bottom 70 --ratio 2.35 --frame --line 0 # 留白后恰为 2.35:1 ``` **⚠️ 加框会改变整体比例**,`pad = int(min(w,h) * ratio)` 依赖短边,而短边又随裁切变化——**手算必然错**(实测手算得 2.377,目标 2.35)。要精确到目标比例就用脚本里的二分,别自己套公式;不加框时 `--ratio` 直接是图像本身的比例,没这个问题。 **改边不必重出图**:原图在 `_raw/`,改白边宽度 / 去线 / 换比例只重跑一次脚本(几秒),别再调生图。 **白边会把水印推到视觉边缘,但裁水印该做还得做**,不能用加框代替。 ## 批量策略 - **默认顺序发**(原因见 ④):一次一张、等结果再下一张,慢十几秒但不用返工。 - 每个 prompt 开头仍要加唯一前缀(见 ①)——成本为零的保险。 - 6 张以上:发完立刻按「生成后」逐张改名 + 写 manifest,别攒到最后一起搬。 - 10+ 张:用 TaskCreate 建清单逐张勾进度,避免「中间看着 OK 就停住」。 - 确实要并行:每批 ≤2 张,失败先 `ls` 确认落盘再决定重发哪张。 ## 风格:说名字调用 **配方、后缀原文、分镜参考、失败复盘全在 `references/style-library.md`**——用之前先读对应那节,别凭记忆拼后缀。 | 名字 | slug | 用在哪 | |---|---|---| | 白纸速写 | `paper-sketch` | 小说 / 纪实 / 年代:白底黑线钢笔速写,四根支柱(线 / 笔 / 调 + 可选框),配五维人物标识包 | | 水墨文艺风 | `ink-wash` | 历史 / 文化 / 人文:淡墨宣纸、留白多、左下角一枚朱砂印 | | 白描水墨 | `baimiao-ink` | 人物白描 + 环境水墨,三色;含「线描主导」「漫画夸张」两个变体 | | 都市淡水彩 | `city-watercolor` | 现代都市 / 志怪心理向 / 回忆:写实淡水彩,冷灰蓝打底、白纸留得多、色表先定;与 `paper-sketch` 是同一篇的两套皮 | - 用户说「**简笔水墨画**」→ `baimiao-ink` 的**线描主导**变体(佛像类必守「只画侧脸轮廓、不做正面近景」)。 - 用户说「**简笔水墨 + 幽默/夸张/小冒犯**」→ `baimiao-ink` 的**漫画夸张**变体(夸张只落在比例与姿态,面部照旧不刻五官,冲突靠道具刻薄)。 - `city-watercolor` 三条要点:**写「水彩」必配满负面清单**(否则塌成儿童绘本/扁平矢量/动漫);**颜色先定色表再写 prompt**(否则好看的颜色被平均撒满全组);**一个明确光源**。详见风格库同节。 - 新增风格:先往库里补一份命名档案,再回这张表加一行。

模型生成摘要(rules/v1 · 2026-11-14 13:56):---
这是模型对公开材料的总结,不是官方声明,请以原链内容为准。

存档时间线

版本存档时间内容哈希内容
v12026-11-14 13:55ac72bac4 可取

版本索引永久保留;内容副本只保留最新 1 份,更早版本仅留索引与哈希(存档时间线的证据链不会因此断裂)。

下载存档内容副本

纠错与举报(发现条目失效、署名有误或涉及侵权?)
提交举报 / 纠错

侵权举报经核验成立后,我们会即时下线该条目并删除已存的内容副本。