Skip to content

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PSD Baker — Krita 保真分层 PSD 导出插件

[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 / 印刷厂时,最头疼三件事:

  1. 图层样式(投影、描边、斜面浮雕、外发光…)和滤镜蒙版导出 PSD 后丢了——Krita 自带 PSD 导出不会把它们映射成 PS 图层样式;
  2. 颜色偏了——文档绑了特殊 ICC(如 Krita 自带的打样特性 Chemical proof),PS 没有该 profile,就拿别的 CMYK 特性去解释,整图变色;
  3. 第三方编辑器里部分照片层整层变黑——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.xmllayerstyle 属性 + 扫描滤镜蒙版;
  • 孤立整文档投影捕获样式(样式只在整文档合成阶段生效),两阶段替换防串扰;
  • 透明占位像素清零,消除薄雾;半透明像素按 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.pybaker_core.pykritapykrita_psd_baker.desktop, 直接放进 Krita 的 pykrita/ 根目录即可(不是子文件夹)。

Windows

powershell -ExecutionPolicy Bypass -File scripts\install_windows.ps1

macOS / Linux

bash scripts/install_mac_linux.sh

安装脚本会把三个文件复制到用户级 pykrita/ 目录并清理旧版本,然后完全退出并重启 Krita

为什么 .desktop 文件名带 kritapykrita_ 前缀? Krita 只对名为 kritapykrita_<名>.desktop 的用户插件默认加载(与自带插件命名一致)。 带这个前缀后,全新安装无需任何手动勾选,重启即出现菜单。 若个别版本菜单仍未出现,再去 设置 → 配置 Krita → Python 插件管理 勾选一次 PSD Baker,再重启即可(这是兜底,不是必需步骤)。

手动安装:把 krita_plugin/ 下的 psd_baker.pybaker_core.pykritapykrita_psd_baker.desktop 三个文件复制到 Krita 的 pykrita/ 根目录: Windows %APPDATA%\krita\pykrita\、Linux ~/.local/share/krita/pykrita/、 macOS ~/Library/Application Support/krita/pykrita/。注意 .desktop 不要改名去掉前缀。

使用

GUI(推荐,一键主动导出)

  1. 在 Krita 里打开并先保存 .kra(插件从磁盘打开一个独立副本烘焙,不会改动你正在 编辑的这个文档,跑完自动关闭副本);
  2. 菜单 Tools/Scripts → Export Faithful Layered PSD(导出保真分层 PSD)
  3. 选择原生主版 PSD 的保存位置;随后弹窗询问是否同时导出 sRGB 屏幕版(默认"是");
  4. 插件在独立副本上烘焙并输出(同目录):
    • *_faithful.psd:原生色彩空间分层主版(嵌入 ICC、样式/滤镜已烘焙、RGB 层补齐 K);
    • *_faithful_verify.png:主版压平校验图,用于肉眼/脚本核对;
    • 选"是"时另有 *_faithful_sRGB.psd*_faithful_sRGB_verify.png(RGB 屏幕版, 分层完整、第三方不黑,文档级转色轻微偏冷,见 PIPELINE 11.3);
  5. 完成弹窗列出烘焙了哪些层、补齐/跳过了哪些层及原因,以及两份 PSD 的路径。

GUI 与无头批处理共用同一个 baker_core.run_bake,产物完全一致;GUI 适合单文件主动导出, 批处理适合多文件/自动化。

无头批处理(Windows 示例)

# 只出原生(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 会无法创建主窗口)。

保真自检(验收 / CI)

先从未改动的 .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。

Photoshop 打开注意

  • 弹出"嵌入的配置文件与工作空间不匹配"时,选 保留嵌入配置文件(Preserve Embedded Profile), 不要选"转换/扔掉",颜色即与 Krita 一致;
  • 印刷出片请用 CMYK 原生导出的那一版;屏幕/快印若需要 sRGB,建议让 PS 自己转换, 不要依赖 Krita 的文档级 setColorSpace(它与导出器转色路径不同,会引入轻微偏冷)。

第三方编辑器兼容性(Patchy / Photopea / GIMP / psd-tools)

症状:分层 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 主版"转换为配置文件";
  • 第三方编辑器仅用于查看/核对时请用"另存为新文件",不要直接覆盖本插件导出的主交付 (第三方保存可能再次丢弃样式/通道)。

已知限制(Roadmap)

  • 文字:源文件里已栅格化的文字任何工具都无法再当文字编辑;矢量/文字层的保留策略待完善;
  • 默认只烘焙 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),传入 Krita Document 和日志/进度回调即可,便于单元化与批处理复用;
  • 无头批处理的任务/结果/日志写在输出 PSD 同目录的隐藏文件 .psd_baker_*(成功后清理); 插件另有一份逐步兜底 trace 写在 %TEMP%\psd_baker_trace.log,批处理完全没触发时先看它;
  • 关键 libkis 坑(Node 不可哈希、waitForDone 无参、setColorSpace 3 参数、样式只在 doc.pixelData 合成阶段出现、插件注册/.desktop 前缀/JSON BOM/$Input 自动变量等)都整理在 docs/PIPELINE.md

License

GPLv3。本插件调用 Krita 的 libkis 接口,随 Krita 生态以 GPL 发布。

About

Krita plugin: bake layer styles & filter masks into pixels and export a layered, colour-faithful PSD that opens identically in Photoshop (GPLv3)

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages