XDRemux v0.4.0
v0.4.0 是 XDRemux 的一次大版本更新,围绕「转换后的照片能不能在 Apple 照片里继续编辑」这一目标,重做了摄影风格与人像模式两条管线,并补齐 HDR 兼容性、实况照片、照片详情与多平台体验。
与上游项目的关系
本项目基于上游 21Z121Z1/XDRemux 的成果。
v0.4.0 的开发参照上游 v1.4(2026-07-27,6d99b56)与后续主分支(af6e448 快照)。
本项目把上游的算法能力移植为 Rust 核心,并加上 Flutter 跨平台界面,使同一套转换引擎运行在 Windows / macOS / Android / iOS / HarmonyOS 五个平台。
v0.4.0 中直接源自上游移植的部分:
| 能力 | 上游来源 | 本项目状态 |
|---|---|---|
| Motion Photo 解析 | 上游 v1.4 xdremux_py/motion_photo.py |
Rust 移植,覆盖 Android V1 / legacy MicroVideo / HEIF mpvd / OPPO LPEX 双码流 |
| ISO-BMFF / GainMap 容器校验 | 上游 v1.4 | Rust 移植,用于拒绝畸形与位深不一致的文件 |
| Motion Photo 门禁 fixture | 上游 14 组 fixture | 移植为自动测试 |
| Apple 摄影风格 | 上游 Swift 管线 | Rust 全平台实现,改为默认路径 |
| Apple 人像 | 上游 Swift 管线 | Rust 移植,并在本项目真机迭代中重做标定 |
一、Apple 摄影风格(Photographic Styles)
可用性
- 输出可在 Apple 照片中继续调节摄影风格,且保存后重新打开仍然生效。
- Rust 实现为全平台默认路径;macOS / iOS 可选择原版 Swift 后端作为对照。
本版本改进
- 空间光照图:改为按需生成动态 32×32 光照图,并在回退路径中清理水印行,避免光照估计被水印区域污染。
- 黑屏与底部色带:主图改用 4:2:0 编码(此前部分设备的硬件解码器无法处理 4:4:4 主图),并将 delta 网格改为随方向自适应,修复了打开风格编辑时的黑屏与画面底部的颜色断层。
- 硬解兼容性:解决风格图在各类硬件解码器上的兼容问题,输出结构向 Apple 原生对齐。
后续开发目标
- 重建天空蒙版:研究使用其他本地模型,不依赖 Apple 原生库生成类似苹果官方行为的 semanticskymatte。
- 摄影风格 3:研究 iPhone 18 Pro 系列与 iPhone Duo 新的摄影风格 3。
二、Apple 人像模式(Portrait)
这是本版本投入最多的部分。目标:OPPO 人像照片转换后,在 Apple 照片里看到干净原图,并且光圈真的能调。
支持范围
- OPPO 人像照片,HEIC 与 JPEG 导出均支持(两者的私有尾部数据结构一致)。
- 要求照片带后置深度数据(尾部
rear.depth)。
底图:干净、未虚化、无水印
- 底图取自照片尾部的
src.image(Ultra HDR JPEG)——未经虚化、未经裁切、不含 Hasselblad/OPPO 品牌水印的相机原始帧。 - 关闭人像效果时看到的就是这张干净原图;开启后才由深度实时渲染虚化。
src.image自带 GainMap,与主图同源配套,因此 HDR 一并保留。- 深度与语义蒙版按
src.image几何等比映射,不再依赖水印内容框推算。
深度标定:让光圈拨杆真正可用
- 旧实现用物理公式
focal × baseline / (disparity × distance)反推标定,改为使用 OPPO 写在rear.depth.config里的每张照片深度曲线。 - 修复部分机型把 rank→视差比例字段写成小整数(按浮点读出是
1.3e-44这类非规格化值)导致视差塌缩为 0、人像「完全没有深度」的问题。
与摄影风格同时开启
- 保留完整人像 MakerNote(含 UUID 与未知标签),仅合并 Styles 必需字段;遇到无法安全迁移的内部偏移时明确失败关闭。
- 修正人像 EXIF 标记:此前误将
CustomRendered = 9写入DigitalZoomRatio (0xA404)并使用了错误类型,导致数码变焦比例被改写;现在正确写入CustomRendered 0xA401 / SHORT / count=1 / value 9,并完整保留DigitalZoomRatio。 - 焦点与深度/蒙版共享统一的旋转、中心裁切、水印填充映射,焦点只归一化一次。
关于「默认开启人像」
- 期望「打开照片即默认开启人像」。实测在深度信息中补写 Apple 原生照片携带的
PortraitScore/PortraitScoreIsHigh不会改变默认状态。 - 要达到默认开启,必须让主图本身即虚化结果(iPhone 原生人像即如此),这与「关闭人像时显示清晰原图」相互冲突,因此本版本维持默认关闭,由用户手动开启。
- 写入的
SimulatedAperture即拍摄时的原始光圈值(例如 f/9.0、f/4.5)。
三、HDR 与 Ultra HDR 兼容性
- 修复 Ultra HDR JPEG(谷歌/OPPO 等)以及扩展名为
.heic但实为 JPEG 的样张无法识别 HDR 的问题;分类与检视阶段现在都能正确识别。 - 新增真实线性缩略图生成,替换此前的黑色占位图。
- 加固 ISO-BMFF / GainMap 容器校验(移植上游 v1.4 的校验逻辑),对畸形或声明的位深与实际流不一致的文件给出明确错误而不是产出坏文件。
四、实况照片(Live Photo / Motion Photo)【本版本新增】
0.3.x 不支持实况照片;v0.4.0 全新引入这套能力。
- 导入与识别:识别 OPPO / Android 的 Motion Photo(Android V1 / legacy MicroVideo / HEIF mpvd / OPPO LPEX 双码流),自动拆出静帧与视频。
- Live Photo 合成:生成 HEIC + MOV 配对,可直接导入 Apple 照片播放。默认策略即为合成;可选仅静帧、拆分静帧 + 视频。
- QuickTime 规范对齐:实况照片元数据轨道加入
tref→cdsc原子,精准指向对应视频轨道,符合 Apple Live Photo timed metadata 规范;静帧时间戳越界容差增强。 - 修复读取 Apple MakerNote 时未尊重头部字节序的问题。
五、照片详情面板【本版本新增】
- 新增独立的照片详情检视面板:点击任意队列文件即可查看完整元数据,不再需要外部工具。
- 拍摄参数:机型、镜头、光圈、快门、ISO、焦距、曝光补偿、拍摄时间等 EXIF 信息。
- HDR 信息:动态范围(EDR scale)与 GainMap 增益曲线。
- 实况照片结构:双码流规格、时长与音轨信息。
- 支持一键复制,便于问题报告与验收记录。
六、重新转换工作流
- 修复「转换完成后修改设置重新转换时提示文件不可用/被跳过」的问题。
- 临时物化文件的清理改为队列感知:只要队列中仍有该文件的卡片,输入临时文件就持续保留,仅在卡片被移除或队列清空时清理。
七、界面与多语言
- 新增双语界面(中文 / English),通过统一的文案层覆盖全部界面。
- 桌面端:修复运行状态遮罩导致的布局崩溃(
Positioned直接置于Column)。 - 修复设置中的实况照片默认策略未正确传递到队列的问题。
- 移除队列卡片上冗余的 X6/X7 家族标签。
- 整理页面增加 MOV 文件重名规避与批量失败分类统计。
八、平台支持
- HarmonyOS 纳入为第 5 个平台(Windows / Android / iOS / macOS / HarmonyOS)。
- 新增设备兼容性矩阵文档,记录各机型与早期固件的实测结论。
已知限制
- Apple 摄影风格与人像模式仍属实验性能力,不承诺与 Apple 原生结果逐像素等价。
- 人像效果默认关闭(见上文说明);人像模式要求照片包含后置深度数据。
- 人像标定依赖 OPPO 写入的每张照片深度曲线;遇到未记录的新布局时会回退到较不可靠的物理公式。
- 前置摄像头深度数据(
front.depth)尚未消费。 - 人像标定的绝对尺度参照为少量 Apple 参考照片(视差跨度实测 0.41–2.13),场景差异更大的极端样本可能需要后续微调。
- 上游对 OPPO
zero-quantization人像样本(头部未写有效 rank→视差比例)直接拒绝处理;本项目给出了可用结果,但该路径的标定属于本项目自己的推断,非上游验证过的行为。