5.0 KiB
5.0 KiB
ppl2psd — Photo Editor (.ppl) ↔ Photoshop (.psd) 转换工具
将安卓「照片编辑器」(Photo Editor, dev.macgyver) 的多图层项目文件 .ppl
与 Adobe Photoshop 的 .psd 双向转换。
.ppl 本质是 ZIP 包:内含 layers.ini(图层描述)+ 若干 *.img(图层 PNG)。
功能
ppl2psd.py — PPL → PSD
| 特性 | 说明 |
|---|---|
| 默认(栅格化) | 所有层(位图/形状/文字)转成像素图层,视觉与 App 一致 |
--type-layer |
文字层转成可编辑的 TypeLayer(PS 里可改字/字号/颜色) |
| 图层组映射 | ppl 的 [group] + 图层 groupId → PSD 图层组(含嵌套),无需参数 |
| 加粗映射 | textFontStyle=1(伪加粗)→ TypeLayer 的 FauxBold / 栅格化 stroke 加粗 |
| 阴影渲染 | 形状/文字层的阴影(distance / blur / angle / opacity)栅格化还原 |
| 渐变 | 形状填充渐变、形状渐变描边、文字渐变填充(栅格化) |
| 透明度映射 | ppl 的 alpha(0-255) → PSD 图层不透明度 |
| 矢量放大 | --scale 将整个项目等比放大(画布/图层/文字/阴影 ×N) |
| 内存安全 | 渲染+编码流式流水线,单层释放;超大画布不爆 RAM |
| 进度条 | tqdm 显示渲染/编码进度 |
psd2ppl.py — PSD → PPL
- 像素层 →
[bitmap]层(导出 PNG + 位置/透明度/可见性) - 文字层(TypeLayer)→
[text]层(内容/字号/颜色,字体映射到手机字体) - 图层位置、不透明度、可见性保留
安装
# 必需
pip install pillow tqdm
# 可选:TypeLayer 可编辑文字(--type-layer 需要)
pip install psd-tools fonttools
# 可选:通道编码加速(缺失时自动降级为 PIL 实现)
pip install numpy
psd-tools/fonttools仅 TypeLayer 模式需要;numpy缺失时自动降级。
用法
# PPL → PSD(栅格化,默认)
python3 ppl2psd.py input.ppl -o out.psd --preview out.png
# PPL → PSD(文字转可编辑 TypeLayer)
python3 ppl2psd.py input.ppl -o out.psd --type-layer
# PPL → PSD(整个矢量项目等比放大 2 倍,画布/图层/文字/阴影 ×2)
python3 ppl2psd.py input.ppl -o out_2x.psd --scale 2
# PSD → PPL(反向)
python3 psd2ppl.py input.psd -o out.ppl
参数:
-o/--output:输出路径(默认与输入同名)--preview:同时输出合成预览 PNG(1x 时降采样到 2000px 宽;--scale非 1 时输出全分辨率)-j/--workers:通道编码并行进程数(默认CPU 核数/2,--scale ≥2时自动降为 1 防爆内存)--type-layer:文字转 TypeLayer--scale:整个矢量项目等比放大倍数(默认 1.0)
目录结构
ppl2psd/
├── ppl2psd.py # PPL → PSD
├── psd2ppl.py # PSD → PPL
├── tools_tysh_template.bin # TypeLayer 引擎数据模板(取自 PS 生成文件)
├── LICENSE # MIT
├── .gitignore # 忽略素材/产物(samples/、*.ppl、*.psd、*.png 等)
└── samples/ # 本地测试素材(不入库)
已知限制
- 栅格化模式(默认)下文字/渐变/圆角都是像素,PS 里不可编辑(可移动/缩放/调透明度)
- TypeLayer 模式:PS 里文字可编辑,但需要电脑安装对应字体(
/storage/emulated/0/Fonts/下的 汉仪花冠、思源宋体/黑体、行楷等),否则 PS 会用替换字体显示- PS 打开仍提示"文本图层需要转换";转换后文字可编辑,但部分效果会丢失/变化: 最后字被吞、文本框跑位、渐变变纯色、阴影/描边丢失(栅格化模式可完整保留这些效果)
- 形状渐变/圆角在两种模式下均栅格化(不可编辑渐变参数)
- 文字层阴影在栅格化模式还原;TypeLayer 模式的阴影/描边需在 PS 里手动重加
--scale 2全分辨率输出可达 2 万像素级宽,内存占用高(已做流式编码优化, 建议确保设备可用内存 ≥ 8GB)- PSD → PPL 反向转换后,原 ppl 的文字/形状矢量信息无法恢复(已栅格化)
校准说明
ppl 的文字渲染与 PS 有系统性差异,本项目针对 App 导出图做了逐项校准:
- 字号系数:App 实际字号 =
textSize × k(按字体族配置,思源宋体 0.8、黑体 1.0 等) - 字符宽度:PIL 的 CFF 字体 advance 与 App 不同,按全角/半角/标点/空格分系数修正
- 对齐:居中基准按字体族区分(advance 居中 vs 内容居中)
- blending ranges:PS 要求图层合成范围为全范围 (0..65535),否则图层不参与合成(画布空白)
- 阴影:App 的
shadowDistance/shadowBlur/shadowAngle换算为 PIL 高斯模糊 + 偏移,shadowOpacity叠加到阴影 alpha - 透明度:ppl
alpha0-255 直接映射 PSDopacity0-255(PS 显示 0-100%),渲染时不再重复应用
修改 ppl2psd.py 顶部的 FONT_PROFILES 可调整各字体渲染参数。