拼贴艺术
你会获得一个主题或一段文字。你的工作是制作一件拼贴艺术作品,而不是描述它。端到端地工作:阅读 → 提取 → 寻找图像 → 构图 → 渲染 → 验证 → 解释。
此技能是一个文件夹,而非单个文件
仅当 SKILL.md、references/、scripts/、requirements.txt、install.sh、install.ps1 和 scripts/check_setup.py 都存在于同一目录时,安装才算完整。如果缺少其中任何一项,请重新安装整个包,不要单独复制 SKILL.md。
步骤 0 — 检查安装(仅需执行一次)
python3 scripts/check_setup.py
该脚本会验证 Python 版本、所有捆绑文件、Pillow、NumPy、字体解析、渲染器冒烟测试以及内容切割冒烟测试。如果缺少任何组件:
bash install.sh # macOS / Linux:安装 requirements.txt,然后重新运行检查
# Windows:powershell -ExecutionPolicy Bypass -File install.ps1
安装程序仅需网络连接以获取 Python 包;该技能的其他所有部分均可离线运行。
核心概念来源于 references/ 中的参考材料:拼贴是一种对已有历史材料的组装(Rise Art、Artsy),其视觉逻辑是 断裂 / 重组 / 融合(UISDC)。因此,最终作品必须看起来像被剪下的纸,被胶粘住并重新扫描,而且必须通过将两个不同的事物放在一起,传达出一个思想。
不要要求用户做艺术决策
推断所有可以推断的内容:策略、调色板、格式、标题、主题。只有当提示词是一个没有上下文的模糊单词,或者显然需要用户自己的素材时,才进行询问。默认使用 1200×1500 的海报格式、以下六种策略之一,并自主寻找图像源。
步骤 1 — 读取并提取(这是创意步骤;由你来执行)
阅读用户的主题或段落,并编写一个小的概念 JSON 文件。不要仅仅从文本中列出名词。请执行以下操作:
- 识别文本中的张力或运动(什么在变化,什么是对立的,什么在回归,什么在失去)。拼贴需要两个不同的事物。
- 写一个配对句:“X 遇见 Y,暗示了 Z。”这是作品的核心论点。如果你写不出来,说明你还没理解文本。
- 提取 2–4 个可以承载该论点的视觉母题。为每个母题写出一个具体的图片搜索查询(英语在 Commons 上效果最好)和一个解释其意图的
why。优先选择可拍摄的物体和纹理,而不是抽象名词。“记忆”不是母题;“一张褪色的票根”、“一道破碎的浪”、“一片夜空的天际线”才是。 - 从
references/movements.md中选择一个与情感基调相匹配的策略,以及一个由 2–4 种颜色构成的调色板。 - 选择一个标题(一个简短的、像是从杂志上剪下来的短语,可以是用户的母语或英语),以及可选的副标题(一行小的等宽字体文本)。
将其写入 <job>/concept.json:
{
"theme": "潮汐与城市",
"headline": "TIDE / CITY",
"kicker": "A NOTE ON DISTANCE",
"statement": "The returning tide meets the sleeping city, suggesting a memory that keeps coming back.",
"strategy": "surrealism",
"palette": ["#16283a", "#d94f36", "#4a86a8", "#f0c94b"],
"motifs": [
{"id": "tide", "query": "breaking ocean wave water", "role": "hero",
"why": "the returning tide, the thing that keeps coming back"},
{"id": "city", "query": "city skyline night silhouette", "role": "ground",
"why": "the sleeping city, the fixed thing"},
{"id": "moon", "query": "moon crater lunar surface", "role": "satellite",
"why": "the distant witness, one impossible object inside the arch"}
]
}
strategy 可以是 cubism、dada、surrealism、pop、decollage、editorial 之一。role 是 hero(一个)、ground 或 satellite。完整模式见:references/concept-schema.md。
当用户提供他们自己的图片时,跳过步骤 2,并编写一个指向这些文件的 SOURCES.json 清单,其中 license: "user-provided"。
步骤 2 — 自主寻找源图像
python3 scripts/source_assets.py --concept <job>/concept.json \
--out-dir <job>/assets --per-motif 1
该脚本会搜索维基共享资源,仅保留 CC BY / BY-SA / CC0 / 公共领域的结果,跳过带有人格权警告的文件,下载缩略图,并为每张图片写入包含作者、许可和来源页面的 <job>/assets/SOURCES.json。不要跳过此清单——成品必须可溯源。当某个母题的搜索结果不佳时,使用 --query-only "..." 来探测搜索词,然后编辑概念并重新运行。
好查询的规则:具体名词,无审美形容词(“beautiful”、“vintage”),2–4 个词,避免返回人物的查询。如果下载的图片被发现是肖像或图表,请替换它——在步骤 5 中检查渲染结果,而不要仅信任文件名。
如果环境没有网络,请说明情况,并继续使用程序化的纸张资源(photo、newsprint、grid、wood、halftone),这些资源无需下载。当资源路径缺失时,渲染器会优雅降级。
步骤 3 — 根据可见内容切割图像
此步骤不可省略。 一件完成的拼贴画绝不能是一堆带有装饰性撕裂边缘的完整矩形照片。观察每张源图像,切割出承载意义的部分:剪影、一只手、一个键盘、一张嘴、一块桥板、一条深色对角线、一片蓝色区域、一排座位、一个黑板、一条穿过草丛的小径。将这些图像形状的碎片重新组合,使接缝成为论点。Lydia Rink 的初学者指南强化了这一概念的实体版本:美工刀用于精确切割元素;在粘贴前松散排列;留出负空间;变化比例;使用图层创造深度。
scripts/visual_cutout.py 是一个故意保持轻量级的数字美工刀。它仅使用 Pillow 和 NumPy。主要模式是 shape:观察源照片,用归一化多边形描述可见的物体或结构区域。第二种 silhouette 模式根据颜色距离移除纯边框/背景。没有重型图像分割依赖。编译器还会写入 cuts/contact-sheet.jpg;在构图前检查它,如果切割未命中主体,则调整多边形。
编译器执行切割,并将生成的透明 PNG 绑定到配方中,使用 mask: "alpha":
python3 scripts/theme_to_recipe.py --concept <job>/concept.json \
--assets <job>/assets --recipe <job>/recipe.json \
--cutouts <job>/cuts --seed 11 --format poster
在概念中描述每个母题的切割(cut),或者在一个以母题 ID 为键的 cuts 映射中描述。一个母题可以提供一条指令或一个指令列表,这将从一张照片中产生多个碎片:
"cut": [
{"mode": "shape", "shape": "0.00,0.00;1.00,0.00;1.00,0.46;0.00,1.00"},
{"mode": "shape", "shape": "0.00,0.79;0.34,0.60;1.00,0.73;1.00,1.00;0.00,1.00"}
]
对于你在照片中看到的语义轮廓使用 shape;坐标是归一化的 x,y;x,y;...。仅当物体位于类似纸张的纯背景上时使用 silhouette。保留一两个几何形状/撕裂的纸片作为对比,但找到的照片必须首先根据内容切割。有关切割方法的详细信息,请参阅 references/composition.md;有关 alpha 源和遮罩的信息,请参阅 references/materials.md。
步骤 4 — 渲染
python3 scripts/collage.py --recipe <job>/recipe.json --out <job>/final.png
渲染器会应用纸纤维、半色调网屏、撕裂边缘、印刷套准、投影、胶带、铅笔痕迹、颗粒感和一种统一的暖色调。它是确定性的:相同的配方加上相同的种子会生成相同的图像。渲染两三个种子并选择最佳的一个——撕裂边缘和刻面区域会有所不同。
步骤 5 — 验证,然后解释
在交付之前,始终查看你生成的图像(打开它或生成联系表)。对照 references/composition.md 中的反模式进行检查:颜色过多、每层都有阴影、所有元素都是 0° 旋转、全是撕裂的边缘、字体比碎片小,尤其是照片仍然像一个完整的矩形窗口而不是一个从其自身内容中切割出的形状。如果在缩略图大小时语义切割不清晰,请返回步骤 3。如果失败,请调整配方或策略并重新渲染。
然后交付 PNG 以及一个简短的解释,包括配对句、策略以及为什么选择这些母题。包含 SOURCES.json 中的署名行;在需要时复制许可条款(CC BY-SA 可能要求衍生作品以相同方式共享)。引导用户查看 recipe-rationale.md 以获取完整的决策日志。
快速参考
| 需求 | 命令 |
|---|---|
| 验证安装 | python3 scripts/check_setup.py |
| 安装 Python 依赖 | bash install.sh |
| 查看所有内置样式 | python3 scripts/collage.py --list |
| 渲染预设 | python3 scripts/collage.py --preset dada-montage --out out.png |
| 将预设保存为可编辑的配方 | python3 scripts/collage.py --preset cubist-grid --out x.png --dump x.json |
| 手写配方 | python3 scripts/collage.py --recipe x.json --out x.png |
| 切割手动观察的轮廓 | python3 scripts/visual_cutout.py --input photo.jpg --out cut.png --mode shape --shape "0,.1;1,0;.9,1;0,.9" --contact-sheet sheet.jpg |
| 移除纯背景 | python3 scripts/visual_cutout.py --input object.jpg --out cut.png --mode silhouette |
| 探查图像搜索 | python3 scripts/source_assets.py --query-only "moon crater" |
| 离线测试概念 | python3 scripts/source_assets.py --concept c.json --out-dir a --offline |
此技能包含的文件
requirements.txt 声明了 Pillow 和 NumPy。install.sh(macOS/Linux)和 install.ps1(Windows)安装它们并运行 scripts/check_setup.py。scripts/check_setup.py 验证每个捆绑文件、Python 版本、字体解析、渲染器冒烟测试和切割冒烟测试。scripts/collage.py 是渲染器(Pillow + NumPy,无需网络)。scripts/visual_cutout.py 切割手动观察的多边形和简单的纯背景剪影(Pillow + NumPy,无需网络)。scripts/source_assets.py 是 Commons 搜索/下载器(仅标准库)。scripts/theme_to_recipe.py 将概念编译为配方,并运行轻量级的内容切割命令。
references/movements.md 是艺术史决策图,附有来源。
references/materials.md 记录了纸张库存、来源、边缘和混合模式。
references/composition.md 记录了布局系统和反模式。
references/prompts.md 提供了当文本到图像模型比渲染器更合适时的提示模式。
references/concept-schema.md 是概念 JSON 的契约。
assets/ 是用户提供的源图像的存放位置(可选)。
一个历史工作示例(主题 → 概念 → 获取的资源 → 配方 → 理由 → 最终 PNG)位于仓库的 examples/demo/ 目录中;它展示了早期的矩形碎片流程,并作为渲染器示例保留,而非当前的内容切割工作流。仓库本身是可安装的包:SKILL.md、references/、scripts/、安装程序和 assets/ 位于根目录。dist/collage.skill 是一个 ZIP 文件,包含这些确切的文件,且这些文件在存档根目录下具有相同的路径。