[English summary] A Krita Python plugin that bakes layer styles and filter masks into pixels, rebuilds RGB photo layers embedded in a CMYK document with an explicit K (black) channel (so third-party readers such as Patchy / Photopea / psd-tools no longer render them solid black), and exports a layered, colour-faithful PSD that looks identical in Photoshop. Krita's built-in PSD export drops layer styles/filter masks and writes RGB layers without a K plate, and Photopea loses layers; this plugin keeps every layer while making the effects and channels survive, with sub-1/255 colour difference (measured). Runs inside Krita (libkis); GPLv3.
把 Krita(.kra)交给 Photoshop / 印刷厂时,最头疼三件事:
- 图层样式(投影、描边、斜面浮雕、外发光…)和滤镜蒙版导出 PSD 后丢了——Krita 自带 PSD 导出不会把它们映射成 PS 图层样式;
- 颜色偏了——文档绑了特殊 ICC(如 Krita 自带的打样特性
Chemical proof),PS 没有该 profile,就拿别的 CMYK 特性去解释,整图变色; - 第三方编辑器里部分照片层整层变黑——CMYK 文档里嵌着仍是 RGB 色彩空间的粘贴素材层, Krita 导出时这些层没有黑版(K)通道,PS/Krita 能正确补零,但 Patchy、Photopea、GIMP、 psd-tools 等会把缺 K 的 CMYK 层解码成全黑。
PSD Baker 的做法是在 Krita 渲染阶段把样式/滤镜的最终外观"烘焙"进对应图层像素,把 CMYK 文档里的 RGB 素材层重建成带完整 C/M/Y/K 通道的原生层,同时保留所有图层、混合模式与不透明度, 并在原生色彩空间导出、嵌入源 ICC。最终 PSD 在 PS 里打开即"所见即所得",在 Patchy 等第三方 编辑器里也不再黑层,且仍然分层、可继续编辑像素。
实测样本(2598×1063、CMYKA/U8、15 处图层样式 + 多个滤镜蒙版;正/背面组都可见时共烘焙 18 个 样式/滤镜层、为 8 个嵌入的 RGB 照片层补齐 K 通道):原生 CMYK 版与"当前 .kra 压平金标准" 逐像素差异 mean RGB ≈ 0.18 / 0.28 / 0.28(0–255)、差异 >10 的像素仅 0.011%,48 层 记录完整、嵌入源 ICC,所有原 RGB 照片层在 psd-tools 下均能逐层解码、Patchy 不再黑;同一次运行 还可再导出一份 sRGB 分层版(RGB 空间天然不缺 K,文档级转色有轻微冷偏)。原理与踩坑见
docs/PIPELINE.md。
| 方案 | 分层 | 图层样式/滤镜 | 颜色(特殊 ICC) |
|---|---|---|---|
Krita 官方 PSD 导出 / CLI --export |
✅ | ❌ 样式/滤镜不映射,丢失 | 取决于 PS 是否认嵌入 profile |
| Photopea 直接打开 .kra | ❌ | 不稳定 | |
| KPConvert | ✅ | ❌(只解决"继承透明度↔剪切蒙版") | 不处理 |
| 批量导出类(GDQuest / Live2D Prep) | 拆件导出 | ❌ | 不处理 |
| 纯 Python 库(如 kritapy) | 可造/改 kra | ❌ 无渲染引擎,无法烘焙样式 | 不处理 |
| PSD Baker(本项目) | ✅ | ✅ 烘焙进像素、外观保留 | ✅ 原生空间导出 + 嵌入 ICC,零转色差 |
- 自动识别需要烘焙的层:解析
.kra/maindoc.xml的layerstyle属性 + 扫描滤镜蒙版; - 孤立整文档投影捕获样式(样式只在整文档合成阶段生效),两阶段替换防串扰;
- 透明占位像素清零,消除薄雾;半透明像素按 straight alpha 原样保留;
- 在文档原生色彩空间烘焙/导出,不做有偏的文档级转色,PSD 嵌入源 ICC;
- CMYK 文档里的 RGB 照片层自动补齐黑版(K)通道:通过整文档孤立合成把它们重建成原生 CMYK 层,消除 Patchy / Photopea / GIMP / psd-tools 下的"整层纯黑"(捕获时临时满不透明度, 层透明度仍作为可编辑属性保留);隐藏组内的层默认不处理;
- 保留层树结构、组、混合模式、不透明度、隐藏层;依赖底色的混合层(multiply/screen/divide 等)与非普通组自动跳过并报告,不硬烤;
- 一次烘焙可同时导出两份分层 PSD:原生色彩空间的印刷主版(零色差、嵌源 ICC)+ 整文档转 sRGB 的屏幕版(RGB 空间天然不缺 K,Patchy/Photopea/GIMP/网页/手机/快印直接用;文档级转色 有轻微冷偏,要准色让 PS 转,见 PIPELINE 第 11 节);
- 同时提供 GUI 菜单动作与无头批处理(JSON 任务)两条路,共用同一核心;
- 附带保真自检脚本(逐像素色差 + PSD 结构/ICC 校验),可量化验收、可进 CI。
插件是扁平三文件布局:psd_baker.py、baker_core.py、kritapykrita_psd_baker.desktop,
直接放进 Krita 的 pykrita/ 根目录即可(不是子文件夹)。
powershell -ExecutionPolicy Bypass -File scripts\install_windows.ps1bash scripts/install_mac_linux.sh安装脚本会把三个文件复制到用户级 pykrita/ 目录并清理旧版本,然后完全退出并重启 Krita。
为什么
.desktop文件名带kritapykrita_前缀? Krita 只对名为kritapykrita_<名>.desktop的用户插件默认加载(与自带插件命名一致)。 带这个前缀后,全新安装无需任何手动勾选,重启即出现菜单。 若个别版本菜单仍未出现,再去 设置 → 配置 Krita → Python 插件管理 勾选一次PSD Baker,再重启即可(这是兜底,不是必需步骤)。
手动安装:把
krita_plugin/下的psd_baker.py、baker_core.py、kritapykrita_psd_baker.desktop三个文件复制到 Krita 的pykrita/根目录: Windows%APPDATA%\krita\pykrita\、Linux~/.local/share/krita/pykrita/、 macOS~/Library/Application Support/krita/pykrita/。注意.desktop不要改名去掉前缀。
- 在 Krita 里打开并先保存
.kra(插件从磁盘打开一个独立副本烘焙,不会改动你正在 编辑的这个文档,跑完自动关闭副本); - 菜单 Tools/Scripts → Export Faithful Layered PSD(导出保真分层 PSD);
- 选择原生主版 PSD 的保存位置;随后弹窗询问是否同时导出 sRGB 屏幕版(默认"是");
- 插件在独立副本上烘焙并输出(同目录):
*_faithful.psd:原生色彩空间分层主版(嵌入 ICC、样式/滤镜已烘焙、RGB 层补齐 K);*_faithful_verify.png:主版压平校验图,用于肉眼/脚本核对;- 选"是"时另有
*_faithful_sRGB.psd与*_faithful_sRGB_verify.png(RGB 屏幕版, 分层完整、第三方不黑,文档级转色轻微偏冷,见 PIPELINE 11.3);
- 完成弹窗列出烘焙了哪些层、补齐/跳过了哪些层及原因,以及两份 PSD 的路径。
GUI 与无头批处理共用同一个
baker_core.run_bake,产物完全一致;GUI 适合单文件主动导出, 批处理适合多文件/自动化。
# 只出原生(CMYK)印刷主版
powershell -ExecutionPolicy Bypass -File scripts\batch_convert_windows.ps1 `
-KraPath 'D:\path\art.kra'
# 一次烘焙、同时出 CMYK 主版 + sRGB 屏幕版(各带一张 verify PNG)
powershell -ExecutionPolicy Bypass -File scripts\batch_convert_windows.ps1 `
-KraPath 'D:\path\art.kra' `
-OutPsd 'D:\out\art_CMYK.psd' `
-SrgbPsd 'D:\out\art_sRGB.psd'
# 其它可选:-Krita 'C:\...\krita.exe' -TimeoutSec 900 -NoVerify -ForceBakeAll层多时(样式/滤镜层 + 嵌入 RGB 层几十个)单次约 8–14 分钟,-TimeoutSec 相应调大。
批处理通过一次性 JSON 任务文件驱动(Krita 5.2 的 CLI 不支持 --start-and-script,
详见 PIPELINE.md 第 8 节)。任务/结果/日志写成输出 PSD 同目录下的隐藏文件
.psd_baker_job.json / .psd_baker_result.json / .psd_baker_batch.log,成功后自动清理;
任务文件路径通过环境变量 PSD_BAKER_BATCH_JSON 传给 Krita,规避启动器与子进程的 TEMP 差异。
请在普通交互式终端里运行(在某些非交互/嵌套会话里启动 GUI 版 Krita 会无法创建主窗口)。
先从未改动的 .kra 用官方导出器出一张压平金标准:
krita art.kra --export --export-filename gold_flat.png再比对插件的校验图、并检查 PSD 结构:
python scripts/verify_fidelity.py \
--gold gold_flat.png \
--test art_faithful_verify.png \
--psd art_faithful.psd \
--heatmap diff.png合格线:每通道 mean 差 < 1/255、maxdiff>10 的像素 < 1%、PSD 分层且嵌入了非空 ICC; 达标退出码为 0。
- 弹出"嵌入的配置文件与工作空间不匹配"时,选 保留嵌入配置文件(Preserve Embedded Profile), 不要选"转换/扔掉",颜色即与 Krita 一致;
- 印刷出片请用 CMYK 原生导出的那一版;屏幕/快印若需要 sRGB,建议让 PS 自己转换,
不要依赖 Krita 的文档级
setColorSpace(它与导出器转色路径不同,会引入轻微偏冷)。
症状:分层 CMYK PSD 在 Photoshop、Krita 里正常,但在 Patchy 等第三方编辑器里,部分照片
素材层整层纯黑。根因与修复见 PIPELINE.md 第 10 节:这些层在 .kra 里仍是
RGB 色彩空间,Krita 导出时不写黑版(K)通道,PS 会按"缺通道=0 墨"正确补全,而部分第三方
读取器不补、直接解码失败。
- 本插件已自动把可见、普通混合、祖先组安全的 RGB 层重建成带完整 C/M/Y/K 的原生 CMYK 层,
导出后这些层在 psd-tools 下可逐层
topil()解码、Patchy 里不再黑; - 隐藏图层组(整组不可见)里的 RGB 层默认不重建(不显示就不会黑);若你打算在第三方 编辑器里展开隐藏组,请先在 Krita 里把该组设为可见再导出;
- 交付建议:屏幕 / 网页 / 手机 / Patchy·Photopea·GIMP / 普通快印(RGB 流程)用 sRGB 版; 印刷厂 / 明确要 CMYK / 要求与 Krita 严格一致用 CMYK 版(PS 打开时保留嵌入配置文件);
- sRGB 版在 GUI 导出时选"是"、或批处理加
-SrgbPsd即可一次烘焙同时产出。它是整文档转色后的 RGB 分层 PSD,每层天然 RGBA 四通道、不存在缺 K 黑层;但 Krita 文档级转色有轻微偏冷(实测 蓝通道均值约 12/255,暖米色区最明显,见 PIPELINE 11.3),要颜色也准的 sRGB 请在 PS 里从 CMYK 主版"转换为配置文件"; - 第三方编辑器仅用于查看/核对时请用"另存为新文件",不要直接覆盖本插件导出的主交付 (第三方保存可能再次丢弃样式/通道)。
- 文字:源文件里已栅格化的文字任何工具都无法再当文字编辑;矢量/文字层的保留策略待完善;
- 默认只烘焙
normal混合且祖先组为普通/全不透明的样式/滤镜层;其余跳过并报告 (避免把依赖底色的混合错误固化); - RGB→CMYK 通道补齐同样只覆盖可见组内普通混合的 RGB 层;隐藏组内的 RGB 层保持缺 K (整组不显示、不会变黑),需要时先在 Krita 里取消隐藏再导出;
- clone / filter / fill / 调整层、组级图层样式、继承透明度(alpha inheritance,可结合 KPConvert 思路)暂未烘焙;
- 目前覆盖 8bit 的 RGB(A)/CMYK(A)/Gray(A);16bit/浮点位深、更多混合模式映射是下一步;
- 必须在 Krita 进程内运行(样式投影与色彩管理依赖 Krita 引擎,无法做成脱离 Krita 的纯库)。
krita-psd-baker/
├─ krita_plugin/ # 复制进 Krita pykrita 根目录的三个文件(扁平布局)
│ ├─ psd_baker.py # Extension:GUI 动作 + 无头批处理入口
│ ├─ baker_core.py # 烘焙核心(纯标准库,GUI/批处理共用)
│ └─ kritapykrita_psd_baker.desktop # 插件描述(kritapykrita_ 前缀 = 默认加载)
├─ scripts/
│ ├─ verify_fidelity.py # 逐像素色差 + PSD 结构/ICC 自检(PIL+numpy)
│ ├─ install_windows.ps1
│ ├─ install_mac_linux.sh
│ └─ batch_convert_windows.ps1 # 无头批处理包装
├─ docs/PIPELINE.md # 原理与踩坑(开发必读)
├─ LICENSE # GPLv3
└─ README.md
- 核心逻辑都在
baker_core.run_bake(doc, options, log, progress),传入 KritaDocument和日志/进度回调即可,便于单元化与批处理复用; - 无头批处理的任务/结果/日志写在输出 PSD 同目录的隐藏文件
.psd_baker_*(成功后清理); 插件另有一份逐步兜底 trace 写在%TEMP%\psd_baker_trace.log,批处理完全没触发时先看它; - 关键 libkis 坑(Node 不可哈希、
waitForDone无参、setColorSpace3 参数、样式只在doc.pixelData合成阶段出现、插件注册/.desktop前缀/JSON BOM/$Input自动变量等)都整理在docs/PIPELINE.md。
GPLv3。本插件调用 Krita 的 libkis 接口,随 Krita 生态以 GPL 发布。