# 照着别人带来的图改编画风

「这是一张图，照这个画风画。」规则是：**借手笔，绝不借画。** 手笔是一种落笔的方式：什么东西接触纸面，边缘怎么处理，各层按什么顺序落下，纸，配色。画则是题材、构图和版式，这些一样都不带过来。

数字帮你看；它们不做决定。一张图的每一项统计都混合了题材、版式、光照和媒介，所以一页大部分空白的纸，不管是谁的手笔画的，读出来都是「浅、边缘少」，而文字会被读成「线条」。定论是一份写成文字的配方，加上一张用那种手笔画的**另一个**题材的并排对照。（在下面的两个验证里，统计上最近的样张两次都错了：水彩那张给出的是炭笔（charcoal）和碎色（broken-colour），剪贴簿那张给出的是鹪鹩（wren）。）

## 工作流

1. **分析。** `node tools/analyze-style.mjs <image> --json <dir>/profile.json`（在 `engine/` 下运行）。把不属于手笔的东西排除掉，首先是 UI：`--exclude x,y,w,h;x,y,w,h`，或者用 `--crop x,y,w,h` 裁到一块干净的区域。它会打印：配色（OKLab k-means、纸色和墨色、面积占比）、明度调性和对比度、线条的有无和宽度、填色的方向和一致度（对纹理求结构张量）、笔画长度、斑点、积色的边缘、各种硬度边缘的占比、频谱斜率、周期性网格（网点或规则的排线），以及最近的几个样张，连同吻合和不同的那些数值。
2. **看。** 以原尺寸打开图片，**并且**把一块繁忙的区域放大 3 倍裁出来看。在相信任何数字之前，先写下你看到了什么。分析结果只用来读眼睛可能漏掉的东西：笔画方向、网点间距、边缘有没有积色。
3. **用文字写出媒介配方（MEDIUM RECIPE）**，写成一个新样张的文件头注释，先于任何代码：
    - **笔触**（MARK）：什么东西接触纸面，多湿或多干，一个单位笔触是什么。
    - **边缘**（EDGE）：硬、软、消失、积色、撕裂、毛边；边缘在哪里变深或消失。
    - **顺序**（ORDER）：什么先落、什么最后落。顺序就是手笔的一半。
    - **纸**（PAPER）：颜色、纸纹、新旧；平铺哪些纹理、用多大的不透明度。
    - **配色**（PALETTE）：用哪些颜色，以及它们所处的明度范围。

    再写它**不是**什么：它最接近哪个样张，以及让它与那个样张不同的一两点。

4. **挑选或长出最近的样张。** 凭眼睛判断哪个最近，分析结果只在难分高下时用来裁决。复用它的工具包，改的是笔触；只换颜色就是失败（[references/style-guide.md](../style-guide.md) 的「你自己的画风」（Your own style）一节）。
5. **用那种手笔画一个**不同的**题材。** 新题材、新构图，同一份配方。题材仍然必须读得出来：让它相对于底子有自己的一级明度差和冷暖差。
6. **并排比较**：`node tools/compare.mjs <reference> <new.png> --out compare.png [--exclude ...]`。用文字点评：笔触、边缘、顺序、纸、配色，每项一行，写「吻合」或「不同，因为……」。再对你的静帧跑一遍 `analyze-style.mjs` 作为诊断。
7. **迭代**的是配方，不是数字。两三轮是正常的。
8. **存成自家画风**：`styles/house/<name>.json`，里面有样张、配方、关键参数、分析摘要，以及来源记录：参考图的 sha256、文件名、日期、是谁带来的、`embedded: false`，再加一句话说明**没有**从它那里拿什么。从此以后，这个品牌的每一件作品都用这种手笔。

## 不抄袭规则

- 永远不要描摹参考图，不要给它重新排版，也不要重新搬演它。它的题材、构图、角色、标志性母题和文字都不是素材。在世艺术家的标志性母题永远不复制；id 和标签用技法的名称。
- 参考图的任何一个像素都永远不会被画出来。美术核心从不读取这张图；只有工具读。
- 用户自己的图片，只有在用户恰恰要求这样做时，才可以被**嵌入**（作为素材）。
- SSIM 或 pHash 距离无法证明「不是抄袭」，画风距离小也无法证明「改编得令人信服」。这条规则靠构造来守住：新题材、新版式。
- 教学模式是唯一允许紧跟一张图的姊妹流程：见 [teach-drawing.md](teach-drawing.md)。

## 验证（2026-09-25）

| 参考图 | 一句话概括手笔 | 新样张 | 验证产物 |
|---|---|---|---|
| 一张粉彩水彩背景图（排除了终端 UI） | 边缘像锯齿海岸线的水渍、积色的边缘、留出纸白的停顿处、溅点、水粉点出的闪光 | `adaptAquarelle.ts`，一只海月水母 | `styles/house/pastel-blotch.json` |
| 一帧讲解片画面（Ritwika，f_10） | 整齐的撕边粉彩卡片配柔和阴影、打字机字体、细钢笔图解、一幅版画 | `adaptScrapbook.ts`，酸面包为什么会发起来 | `styles/house/quiet-scrapbook.json` |
| 梵高《盛开的杏花》（*Almond Blossom*，1890，公有领域） | 饱蘸颜料的短油画笔触组成方向彼此转折的小块，最后落下一道断续的蓝绿色轮廓线，厚而起棱的白色 | `adaptAlmond.ts`，发布片里那条锦鲤在它的池塘中 | `styles/house/almond-blossom.json` |

## 一份填好的媒介配方（杏花那次验证）

分析器给出的最近样张是炭笔和绘本；凭眼睛看是 `paintedOil`，所以这个样张复用油画的工具包，改的是笔触。配方如下，就是先于任何代码写在样张文件头里的那段：

- **笔触**：不透明的油彩，饱蘸颜料的硬鬃笔，笔画约一指长。底子用一小块一小块的笔触铺成，每块里的笔触朝同一方向，块与块之间方向彼此转折。形体顺着自身的长度方向画。亮部厚涂、起棱。
- **边缘**：硬。最后用一支小圆头笔落下一道深蓝绿色轮廓线，断断续续，在背光一侧更重。没有任何东西跨过边缘被晕开。
- **顺序**：先在各处铺满底子；再用中间调画形体；然后是亮部；然后是轮廓；最后是最亮的白。
- **纸**：上过底料的亚麻画布，布纹透过较薄的底子笔触显出来。
- **配色**：明度范围窄、整体偏亮的绿松石色底子；形体用灰绿色；奶油色和铅白；一点朱红；任何地方都没有黑（最深的一笔是轮廓）。
- **不是**：`paintedOil` 会把形体塑造出纵深；这种手笔让底子保持平面和装饰性，阴影只有一级。题材是影片自己的锦鲤，永远不是那幅画里的树枝。

参考图本身放在 anidoodle 仓库的 `engine/assets/refs/` 下（不在安装后的插件里），是仓库里唯一一张不是由代码画出来的图：公有领域（梵高于 1890 年去世；这是对一件二维公有领域作品的忠实照片），从 Wikimedia Commons 下载并保持逐字节一致，它的来源、许可和 sha256 记在 `engine/assets/refs/PROVENANCE.json` 里。发布片只把它当作用户在聊天里附上的那张图来展示；`adaptAlmond.ts` 从不读取它。你以这种方式随作品发布的任何参考图都要有同样的记录，而且只有真正属于公有领域的作品才有资格。
