1 一图流:拆 → 补 → 叠 → 画 → 验
✅ 已验证(补全那一步除外,📐)
origin.png (1024×1536)
│
┌───────────────┴───────────────┐
│ 拆分 trace_prepare.py │ 裸 python, 不需要 Krita, 约 2.5 分钟
│ 4 segment.regions → 15 部件 │
│ 5 alpha_from_image → 亚像素 α│
│ 6 cel.levels → 2–5 档色阶 │
│ 7 contour.trace → 贝塞尔 │
│ 17–21 strokes.* → 8 万笔计划 │
└───────────────┬───────────────┘
│ plan.json + strokes.jsonl
┌───────────────┴───────────────┐
│ 补全 (📐 未实现) │ 被遮挡的部件补完整
└───────────────┬───────────────┘
│
┌───────────────┴───────────────┐
│ 叠层 + 重绘 job_trace.py │ Krita 无头, 约 5 分钟
│ 12–14 建 307 节点的图层树 │
│ 27 逐笔 paintPath / paintLine│
└───────────────┬───────────────┘
│ final.kra + final.png + strokes.jsonl(日志)
┌───────────────┴───────────────┐
│ 验收 gauge.py │ 归一到 2508px, 以源图为锚
└───────────────────────────────┘
两步,中间是文件
流程被刻意切成两个进程:
| 步 | 进程 | 干什么 | 耗时 |
|---|---|---|---|
| 1 读画 | 裸 python3 | 分割、解 α、切色阶、矢量化、规划笔画 | ~2.5 分钟 |
| 2 落笔 | Krita(xvfb) | 建图层树、加矢量、逐笔画、存盘 | ~5 分钟 |
切开的理由:迭代参数时不用每次起 Krita。第一步产出 plan.json(曲线)和 strokes.jsonl(笔画计划),还有一张 1x 的 preview.png——规划器自己模拟出来的成品,不起 Krita 就能看个大概。第二步只是照着画。
./paint trace 把两步串起来,末尾自动打印判据。
分工:矢量管边,笔画管里面
整条流程的核心主张只有一句:
矢量层 负责边 解析级平滑, 分辨率无关
笔画 负责边以内的一切 平涂 / 柔和过渡 / 排线 / 发丝 / 细节 / 线稿
边为什么不能用笔画?因为笔画是光栅的,在 8K 上画一条边,边的形状取决于笔刷的形状,而不是取决于源图。矢量曲线是从源图的抗锯齿边解出来的(第 5 章),位置准到亚像素,而且 8x / 16x / 100x 都一样光滑。
里面为什么不能用矢量?因为矢量填出来是死平的一块。人画的东西有笔触、有过渡、有排线、有发丝——这些是笔画的事。
两者在 Krita 里的结合点是 clip:矢量层做组底定义形状,笔画层 setInheritAlpha(True) 裁到它。笔可以随便涂出界,边永远是那条曲线(第 13 章)。
一次跑下来的数字
以 origin.png 为例,最终成品:
| 画布 | 8192×12288(8x) |
| 部件 | 15 |
| 色阶组 | 73(每部件 2–5 档) |
| 图层节点 | 307,其中矢量层 74 |
| 贝塞尔 | 607 环 / 20,495 控制点 |
| 笔画 | 80,669 笔 / 99,755 次落笔调用 |
| 写像素 | 2 次(背景铺黑) |
| 耗时 | 读画 ~150s + 落笔 217s + 存盘 ≈ 8 分钟 |
.kra | 323 MB |
判据(全部归一到 2508px 再量,第 32 章):
| 判据 | 源图 | bicubic ×8 | 本流程 |
|---|---|---|---|
| 8px 阶梯指纹(放大痕迹) | 6.19 | 2.23 | 0.78 |
| 梯度 p99(边锐不锐) | 41.6 | 39.3 | 36.9(源图的 89%) |
| 8 级量化色数(层次) | 2900 | 2800 | 1840(63%) |
| 低频 likeness(降到 256 宽比) | — | — | 33.57 dB |
| 全图最暗像素 | (0,0,0) | (0,0,0) | (0,0,0) |
阶梯指纹 2.23 → 0.78 是主结果:放大痕迹没了。边的锐度 36.9 低于纯矢量阶段的 78.9——笔画在软化边,这是第五部末尾明确留下的账。
8K 原尺寸 1:1 眼部特写。左:bicubic ×8(能看到阶梯和糊)。中:只有矢量层(边是真曲线)。右:落完 8 万笔。