附录 A 命令速查
./paint
./paint setup 装/更新 harness (改完 code/ 必须重跑)
./paint check 31 项自检
./paint trace [图] [倍数] 临摹: 读画 + 落笔 + 判据, 默认 work/input/origin.png, 8x, 约 8 分钟
./paint replay <作品名> 统计作画日志 (落笔 / 写像素次数)
./paint probe [名字] 跑一个能力探针; 不带名字就列出全部
./paint landscape 参考作业: 风景, ~6s
./paint portrait 参考作业: 画师金字塔流程, ~12s
./paint list 列出成品
./paint archive <作品名> 把成品拷一份带时间戳的到 work/archive/
./paint clean 清掉历史归档
./paint gui <作业.py> 在真实桌面上看它画
环境变量
读画(trace_prepare.py):
| 变量 | 默认 | 说明 |
|---|---|---|
ART_SCALE | 8 | 输出倍数 |
ART_STYLE | paint | paint / anime(第 20 章) |
ART_DETAIL_T | 34 | 细节笔的误差阈值,越大越少笔 |
ART_EXPAND | 0.6 | Flat 轮廓向外扩的像素 |
ART_SMOOTH | 0.8 | 矢量化前标量场的高斯 σ |
ART_EPS | 0.30 | RDP 容差 |
ART_LINE_THR | 999(关) | 暗脊线稿阈值,paint 风格用 |
落笔(job_trace.py):
| 变量 | 说明 |
|---|---|
ART_SEG | 读画产物目录(含 plan.json) |
ART_SCALE | 覆盖 plan.json 的 scale |
ART_OUT | 成品根目录 |
判据(gauge.py):
| 变量 | 说明 |
|---|---|
ART_SRC | 源图路径,做锚点 |
直接跑两步
ART_STYLE=anime python3 code/trace_prepare.py work/input/origin.png work/cache/origin-anime
./paint setup
ART_SEG=work/cache/origin-anime ART_SCALE=8 ART_OUT=work/output ./krita-bot/run_job.sh krita-bot/job_trace.py
python3 code/gauge.py work/output/trace-origin-anime/final.png
自检与探针
python3 code/contour.py # 矢量化自检 (v4 vs v5 同题)
python3 code/cel.py # 色阶分层在 origin 上跑一遍
./paint probe # 列出所有探针和它们各自要回答的问题
./paint probe filtermask # 跑一个 (等价于下面那条手写的)
ART_OUT=/tmp/x ./krita-bot/run_job.sh probes/probe_xxx.py 2>&1 | grep -aE '^\[|/s|判读'
探针不需要装进 krita-bot/:它们靠 sys.path.insert(0, expanduser("~")) 从 harness
的 HOME 里 import canvas,路径传绝对的就行。改了 code/ 才要重跑 ./paint setup。
探针清单在附录 C。
后台跑长作业
./krita-bot/run_job.sh krita-bot/job_trace.py > job.log 2>&1 &
grep -aE "\[paint\]|\[stage\]|JOB (OK|FAIL)|Traceback|Segmentation" job.log | tail
会话结束会杀掉后台进程,留下 krita 僵尸:pkill -f "krita --nosplash" 再重跑。