照片 × 等距插画 双层海报生成
这个 skill 交付什么
一张 3:4 竖版成品图:上半区是原照片(保持真实质感,仅做高级摄影级调色),下半区是同一主体的微缩实体模型——原照片那块地被整片切下来,安放在一块很薄的层叠纸板上(板侧面露出一层层纸页纹理),哑光材质、近白影棚背景、大面积留白、板下只有一层收敛的接触阴影;配色完全取自原图。画面中嵌入一个克制的英文标题与极少量微型注释。
下区不是插画,也不是照片的复制——它是一个摆在白背景上的实体沙盘。这个心智图像错了,后面全错,详见 references/guide.md 第一·五节。
核心是母版提示词 + 从照片提炼槽位的方法,因此不绑定具体图像工具。
何时触发
- 用户给出一张照片,要求做成「上下分区 / 一半原图一半插画 / 等距插画 / 微缩模型 / 杂志感」海报
- 用户要求把照片转成极简插画但保留原图对比呈现
- 用户描述中出现「纸上模型」「沙盘」「收藏感」「编辑插画」等诉求
不触发:单纯修图调色;只要插画不要原图对比;生成的是多张拼贴或九宫格。
工作流
第 1 步 · 确认输入
确认已有照片的本地路径、附件或图片 URL。没有则先索取。多张照片时逐张处理,并让标题系列化(如 LOW TIDE / HIGH WATER)。
第 2 步 · 读图并提炼四个槽位
用 Read 等能力直接看图,不要凭文件名猜测,然后按规则产出:
| 槽位 | 内容 |
|---|---|
| subject | 一句话:「谁/什么 + 在哪 + 什么姿态朝向」 |
| palette | 3–5 个色,按最深→最亮排列,保留冷暖关系 |
| title | 2–4 词英文标题,编辑体句式大小写(如 Pasture),取自地点/动作/状态/情绪 |
| notes | 一行以内编号、年份或地名(不需要时省略) |
详细提炼规则与示例见 references/guide.md 第二节。这一步不能省——槽位质量直接决定成品质量。
第 3 步 · 装配最终提示词
调用脚本填充母版,不要手工拼装:
python3 scripts/build_prompt.py \
--title "Still Waters" \
--subject "一位老渔民站在木质小船上,面朝左侧" \
--palette "深靛蓝 / 雾灰蓝 / 暖沙白" \
--notes "03"
脚本读取 references/prompt-zh.txt 或 prompt-en.txt,把成品提示词打到标准输出。常用参数:
--variant vertical|square|landscape|wide画幅,默认vertical(3:4 竖版)--layout topbottom|leftright分区轴,默认上下;横构图照片建议改leftright--lang zh|en|both输出哪一版母版,默认中文--extra "..."追加约束;--notes -关闭注释;--uppercase标题转全大写
第 4 步 · 生成(优先路线 A:一次图生图出整张)
路线 A · 一次图生图出整张(首选)
把整份提示词连同原图一起交给图生图,保真度用 high。下区的板顶面需要沿用原照片那块地形,只有把原图交给模型才做得到。
下区会不会退化成照片,不取决于保真度,而取决于母版里那四条机制是否都在:近白影棚背景 + 很薄的层叠纸板基座 + 哑光材质 + 禁止景深/虚化/噪点。母版已经写死,不要删。
路线 B · 裁切 + 合成(备选)
当宿主图生图保真度完全不可控(下区反复写成照片)时使用:上区直接裁原图(零生成、100% 保真),下区用 --part lower 派生出的提示词单独生成,最后本地拼接。
python3 scripts/build_prompt.py --part lower --title "Pasture" --subject "..." \
--palette "..." --notes "03" --extra "..." > /tmp/lower.txt
# → 用 /tmp/lower.txt 走生成(不传参考图),尺寸取 3:2(如 1536x1024)
node scripts/compose_halves.js --photo 原图.jpg --illustration 模型图.png --out 成品.png
第 5 步 · 后处理(几乎每次都要做)
生成结果右下角通常带平台水印(如「AI生成 WORKBUDDY」)。用 skill 自带脚本抹掉,不要裁切(会破坏 3:4 画幅):
NODE_PATH=<sharp 所在 node_modules> node scripts/patch_watermark.js --in 生成图.png --out 成品.png
脚本取水印左右两侧各 1px 竖列做逐行横向插值、并补回同幅度的纸张颗粒,在纯净底与柔渐变底上都看不出痕迹。
再抹掉标题下偶发的装饰横线(母版已加约束防治,但实测仍会偶发):
NODE_PATH=<sharp 所在 node_modules> node scripts/patch_rule.js --in 生成图.png --detect # 先看命中位置
NODE_PATH=<sharp 所在 node_modules> node scripts/patch_rule.js --in 生成图.png --out 成品.png
> 这两个脚本都是「不重跑、不花额度」的局部修补,比重新生成便宜得多。修补前先确认分界线精确落在 y = 高度/2——自动扫描"首个近白行"会被上区照片底部的亮部骗到(guide.md 第七·2.5 节有实例)。
批量处理时逐张跑一遍即可,脚本对「无线可补」的图会原样复制,不会误伤。
第 6 步 · 校验与重试
对照 references/guide.md 第六节自检清单检查成品。不达标时只改一条约束再重生成,不要一次性堆叠多条修改。常见症状与对策见 references/guide.md 第五节。
第 7 步 · 交付
成品图存到工作目录,用宿主提供的文件展示能力交给用户(如 WorkBuddy 的 present_files;对话型平台直接贴图即可),并附上本次使用的标题与色盘,便于用户复用或批量生产同系列。
资源
references/prompt-zh.txt— 中文母版提示词(槽位化,可直接编辑)references/prompt-en.txt— 英文母版提示词(部分图像模型在英文下更稳定)references/guide.md— 下区风格规格、槽位提炼规则、变体矩阵、路线选择、失败修法、自检清单scripts/build_prompt.py— 提示词装配脚本,仅用 Python 标准库。--part full出整张海报提示词,--part lower只出下区模型提示词(合成路线用);运行时自带母版硬约束自检,模板被改坏会告警scripts/compose_halves.js— 合成脚本(需 Node + sharp):自动扫描原图把上区裁切对准主体、抹掉生成图水印、拼接成严格 3:4 / 两区 1:1scripts/patch_watermark.js— 水印抹除脚本(需 Node + sharp),路线 A 与 B 共用。取水印左右两侧竖列做横向插值并补回纸张颗粒,纯净底上肉眼不可见scripts/patch_rule.js— 装饰横线抹除脚本(需 Node + sharp)。自动定位标题下方的下划线/分隔线并重建背景,支持--detect只检测、--y0/--y1/--x0/--x1手工指定。判据与坑位见references/guide.md第七·2 节
> scripts/*.js 全部是可选的后处理:仅在宿主能运行 Node(WorkBuddy / Codex / 本地终端)时用于本地修补与合成。豆包、ChatGPT 等纯对话平台直接用 references/prompt-zh.txt / prompt-en.txt 里的提示词即可,跳过脚本。
硬性约束(任何情况下不得违反)
- 两区高度严格 1:1,分界线落在画面正中
- 上区只调色,不得拉伸、扭曲或重绘主体
- 下区是哑光实体微缩模型,不是扁平矢量插画,也不是照片的直接复制
- 下区基座是很薄的层叠纸板(侧面可见纸页纹理),板顶面沿用原图那块地形
- 下区背景为纯净近白纸色,板下只有一层收敛的接触阴影
- 下区配色必须来自原图,不得引入与原图无关的固定色系
- 下区保留一眼可辨的身份特征
- 规避:卡通感、扁平插画感、高饱和撞色、塑料 3D 感、复杂场景堆积、电商感、模板感、水印、硬边框