Files

117 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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]` 层(内容/字号/颜色,字体映射到手机字体)
- 图层位置、不透明度、可见性保留
---
## 安装
```bash
# 必需
pip install pillow tqdm
# 可选:TypeLayer 可编辑文字(--type-layer 需要)
pip install psd-tools fonttools
# 可选:通道编码加速(缺失时自动降级为 PIL 实现)
pip install numpy
```
> `psd-tools` / `fonttools` 仅 TypeLayer 模式需要;`numpy` 缺失时自动降级。
---
## 用法
```bash
# 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 `alpha` 0-255 直接映射 PSD `opacity` 0-255(PS 显示 0-100%),渲染时不再重复应用
修改 `ppl2psd.py` 顶部的 `FONT_PROFILES` 可调整各字体渲染参数。