Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

13 三条 clip 规则

✅ 已验证 · 探针 probes/probe_clipping.py · probe_clipvector.py · probe_vecstack.py

clip 在 Krita 里叫 inherit alpha(node.setInheritAlpha(True))。它是本书整个叠层架构的支点,三条规则全部实测。

一、裁到「同组内下方各层的累积 alpha」

Group "Skin"
  ├─ Skin_Light   (inherit alpha)   ← 裁到组内下方各层的累积 alpha
  ├─ Skin_Shadow  (inherit alpha)
  └─ Skin_Flat                       ← 组内最底, 定义整个组的形状

实测(组内 base 红块 x∈[100,200)、top 绿条 x∈[20,380)):

条件绿条可见跨度
未开 inherit(20, 379)
开 inherit(100, 199) ← 精确裁到 base
base 再加一块蓝 x∈[280,340)(100, 339) ← 累积,不是紧邻层
group 设 passThroughMode(True)(20, 379) ← 裁剪失效

所以:Flat 必须在组内最底;group 不能 passthrough。

二、矢量层能做底,group 也能被 clip

这两条是第五版新验的,架构成立与否全看它们。

笔画层 clip 到矢量层probe_clipvector.py,8192×12288,39 笔故意画出界):

状态边界带偏差溢出内部均色
① 只有矢量层0.08280.0%(62,110,161) 矢量色
② 笔画层未 clip0.4804100%(227,122,64) 笔色
笔画层 clip 到矢量层0.08280.0%(227,122,64) 笔色
④ 对照:clip 到二值光栅层0.37910.0%(227,122,64) 笔色

③ 与 ① 完全相同——inherit alpha 认矢量层做底,而且把矢量的分数 alpha 原样传给了上面的笔画层。比 ④ 好 4.6 倍,差别全在组底是曲线还是像素格。

group 本身可以 setInheritAlphaprobe_vecstack.py,部件组里是「比剪影大一圈的矢量 + 涂出界的笔画」):

状态组的不透明像素均色
① 只有剪影矢量7,147,891剪影色
② 部件组未 clip10,270,050笔色
部件组 setInheritAlpha(True)7,147,891笔色

③ 与 ① 一模一样:裁的是整组的合成 alpha,只裁 alpha 不换内容。

三、判据必须同时看 alpha

机理是 KisLayer::disableAlphaChannel():合成时只写 R/G/B、不写 A。alpha=0 的地方 RGB 仍然是被写过的。同一次测量里,不看 alpha 的 RGB 跨度是 (64, 255)(tile 对齐),可见跨度只有 (100, 199)。只看 RGB 会得出「没裁剪」。

这条规则有一次历史:v1.0.0 把 base/top 建在根节点下,根下有一个全不透明的 Background,「下方累积 alpha」处处是 255,于是什么也没裁——那是正确行为,却被记成了「clipping 用不了」。复现实验:同样构造放根节点下,跨度确实还是 (20, 379)。

附:transparency mask

另一种裁法,挂在目标图层下才生效(挂到 rootNode 下是孤儿节点):

mask = doc.createTransparencyMask("M")
target_layer.addChildNode(mask, None)
mask.setSelection(sel)

实测挂上后绿条跨度 (20,379) → (120,199),精确。它比 inherit alpha 更适合交给画师:mask 本身可编辑。本书没用它,因为矢量层做底已经够了。