16 .kra 交付规范
✅ 已验证(layers.json 那一节 🧪)
三件套
s.final() 落在 work/output/<作品名>/,名字固定,重跑覆盖:
| 文件 | 给谁 | 内容 |
|---|---|---|
final.kra | 画师 | 完整 layer stack;clip / blend / opacity / color label / 矢量层 往返无损(实测) |
final.png | 预览 | 合成结果 |
strokes.jsonl | 回放 / 审计 | 每一笔(第 22 章) |
layers.json | 后续 AI | 每层的 path / blend / opacity / clip / label / bounds / uid |
stages/NN-*.png | 过程 | 每个 s.stage() 一张 |
命名文法
顶层组 NN_Name 01_BG 04_Color 06_Line 09_Post
部件组 Part Hair_Front Skin_Face Dress_Frill
色阶组 Part_Role Hair_Front_Flat Hair_Front_Shadow1
叶子 Shape / Soft / Marks (在色阶组内)
Role ∈ { Flat, Shadow1, Shadow2, …, Light1, Light2, … }。部件名全局唯一 ⇒ 色阶组名全局唯一。
color label 是第二索引
findChildNodes(colorLabelIndex=N, recursive=True) 是 Krita 唯一自带的「按语义批量取层」入口,在 docker 里就是一条彩色条——一个字段同时喂画师和程序。
| label | 语义 |
|---|---|
| 2 | Lineart |
| 3 | Flat |
| 4 | Shadow |
| 5 | Light |
| 8 | 辅助(BG / Post) |
画师接手时怎么改
| 想做 | 动哪里 |
|---|---|
| 换一个部件的固有色 | 改该部件 _Flat/Shape 矢量的填充色 |
| 调阴影形状 | 改 _ShadowN/Shape 的路径(矢量,可拖节点) |
| 重画某一块的质感 | 清掉 Soft / Marks,在上面画——clip 仍然生效 |
| 隐藏所有笔画看纯色阶 | 按 label 批量隐藏 Soft / Marks |
| 移动一个部件 | 整组移动;被遮挡区是空的(第 8 章) |
体积
.kra | |
|---|---|
| 旧路线(103 层光栅,8K) | 181 MB |
| 只有矢量层(15 层,8K) | 13.8 MB |
| 现在(307 节点,8 万笔) | 323 MB |
矢量层几乎不占空间;体积全在笔画层的 tile。存盘 4–5s。
layers.json:🧪 一个已知的不一致
layers.json 由 Session.manifest() 生成,它遍历的是 s.index——而 s.index 只由 s.build(spec) 填。第五版的 job_trace.py 直接用 doc.createGroupLayer / createVectorLayer 建树,没走 build(),于是 manifest() 拿到空索引,layers.json 没有被重新生成。现在目录里那份是旧路线留下的(103 层,paintlayer,与 .kra 里的 307 节点不符)。
修法有两条:让 job_trace.py 建完树后自己遍历 doc.rootNode() 填 s.index;或让 manifest() 不依赖 index,直接递归 childNodes()。后者更对。没做,所以标 🧪。
还能往里塞什么
三样实测建得出、不改画面、.kra 往返不丢的(第 30 章):
| 东西 | 给画师的价值 |
|---|---|
doc.createSelectionMask(name) + mask.setSelection(sel) | 每个部件一个现成选区,点一下就能只改那个部件 |
doc.createFileLayer(name, 源图路径, "None") | 源 diffusion 图作为对照层躺在最上面,随时开关 |
doc.createCloneLayer(name, source) | 重复部件只存一份;改源,克隆跟着变 |
调色板进不去:Palette / Swatch 在内存里加得进去,但 save() 返回 False
不写盘,而且没有 Document 级的 palette API。图层样式也进不去(第 31 章)。
往返保真的依据
probes/probe_vector.py 与自检第 196–200 项:.kra 存了再开,层数、inheritAlpha、blend / opacity / label、4 个矢量层及其 toSvg() 全部保真。