v0.31.0 — R25 收尾闭合轮:Lightroom 差距全量清账
⚠ 升级前请先读:三类互不相同的前向不兼容
本轮 EditRecipe 数据模型有三处变化,旧版 exe 的反应各不相同,不能混为一谈:
| 变化 | 结构 | v0.30.0 及更早的 exe 会怎样 |
|---|---|---|
EditRecipe 顶层 +29 字段(Texture、裁剪后暗角六、胶片噪点三、Detail 八轴、手动 CA 两、Auto CA、Defringe 六、passthrough、schema_era) |
deny_unknown_fields |
硬拒整个 recipe.json——v0.31.0 存的任何显影,旧版都打不开(与 v0.29→v0.30 的 coord_era 同类) |
LocalAdjustment +4 条局部点曲线 |
deny_unknown_fields |
带蒙版的 recipe 被硬拒;无蒙版的照片字节不变(与 v0.29 的 LocalHue/Sharpness 同类) |
MaskGeometry::Radial +2(midpoint / mask_version) |
内部标签枚举,无 deny_unknown_fields |
静默丢弃再写回=旧版会不声不响地把这两个值从你的文件里抹掉。这是本轮首次出现的第三类,最隐蔽 |
连带:recipe.json 的结构指纹随之改变,R21 的「已删版本登记簿」会把历史上已删的版本一次性以新号重新保档(高水位臂不动=同一个号永不复活)。
建议:升级后不要再用旧版 exe 打开新版存过的照片。
本轮做了什么
R25=收尾闭合轮:把 Lightroom 差距一次清账。 八个包(P0-P6 七个实现提交 + 一个轮末对抗复审修复批)。
真正的头等大事不是「补齐 Lightroom 滑杆」,而是一个缺陷:
你 Lightroom 库里的每一个蒙版,此前在导入时都被整条丢弃。
两道门,任一命中即丢整条 Correction:crs:Angle 存在(Lightroom 给每个径向都写,未旋转时写 "0")、crs:MaskBlendMode 不是我方文件写的(160 份取证 sidecar 里 1048 个蒙版组件全部带)。这和「INERT_LOCAL 非零硬拒」「未知 crs:Local* 硬拒」等共六道门是同一个根因:导入侧「不认识就整条丢、只给一个整数计数」,而导出侧从 R22 起早就是具名的 MaskLoss{name, reason}——这个不对称本身就是根因。
修完之后,在参考库上实测:导入 0 个 → 导入 31 个 / 拒收 11 个(7 份 sidecar、42 条 Correction,导入+拒收==总数 每份成立)。仍然拒收的是画笔 / AI / 深度蒙版(Mask/Paint、Mask/Image、Mask/Aggregate、Mask/Ellipse)——Lightroom 靠 digest 自行重算,第三方拿不到像素,界面上会照实这么说。
新增控件
- 纹理 Texture(全局,渲染)——与蒙版里的纹理是同一个算子、同一个半径式(位级孪生测试钉死:全覆盖蒙版的 texture ≡ 全局 texture)。
- 效果新分区:裁剪后暗角六键 + 胶片噪点三键(携带不渲染)。
- 细节扩充:锐化半径 / 细节 / 边缘蒙版,降噪细节 / 对比,彩色降噪三键(携带不渲染)。
- 镜头扩充:手动色差 红/青 · 蓝/黄(渲染)、自动色差校正开关、去边 Defringe 六键(携带不渲染)。
- 变换 / 校准只读段:透视 Upright 八键 + 相机配置文件 + 相机校准七键,原样带进带出、Autoshop 从不解读——所以只显示值,故意不给滑杆。
- 蒙版:每个蒙版有了自己的四条点曲线(主 / 红 / 绿 / 蓝);径向的
crs:Midpoint/crs:Version读写往返。
「携带不渲染」不是偷懒,是一条明写的裁决:这些算子(Adobe 的胶片颗粒生成器、三种暗角 Style、锐化的 halo 抑制曲线、色度降噪、去边的色相刻度……)都未公开。近似它们=把我们编的算子塞在你和你的照片之间。所以每一条这样的控件自己身上就写着「本机不渲染,仅随 XMP 带出」,保存时也会列出当前生效的整份清单。24 条全局成员逐条带着理由钉在代码里。
可感行为变更(会改变你已有照片的观感/文件)
- 带 Lightroom 蒙版的老照片重开,会突然多出蒙版并改变渲染。 这是上面那个缺陷修好的直接结果(与 v0.28.0「蒙版三项上引擎」同类)。
- 带
crs:Texture的照片渲染改变(参考库 160 份里 7 份,最大 +26 那张最明显)——此前该值被静默丢弃。 - 带局部点曲线的照片渲染改变(参考库 19/160,共 43 条曲线)。
- 每份写出的 sidecar 现在恒含
crs:Texture,即使为 0 → 与旧版相比字节必然不同。 - 导入横幅换了说法:从「N unsupported Lightroom correction(s) not applied」改成「已导入 N 个 Lightroom 蒙版,其中 M 项未建模」并点名是哪几项(旋转角度 / 混合模式 / 未建模的滑杆 / 局部点曲线 …)。
- 旋转损失现在报角度:「旋转 37° 未写入 XMP(
crs:Angle的符号与旋转基准未经实测)」,而不是含糊地说「有旋转」。crs:Angle仍然不写出——在读不懂的刻度上断言方向,不如让 Lightroom 用它自己的默认值。 - 「暗角」改名「镜头暗角」(与新的「裁剪后暗角」消歧)。
i18n里在案的承诺「De-fringe in a later batch / 去紫边留待后续批次」已删除——这一批就是它。- Settings 多一条只读披露:当前解析到的 segmentation sidecar 脚本路径 + 为什么它只能用环境变量设置(它会被当作程序执行)。这把 v0.28.0 的「留 R23」正式结案为一次安全裁决,而不是欠账。
接受成本(轮末对抗复审后的裁决,明写在此)
轮末 Opus 5 独立对抗复审判定 BLOCK,抓到一个根因、两处 HIGH(都在真实 sidecar 上对 v0.30.0 做了前后实证):「配方没见过的键,被读成了用户主动清空」。
- 无损导入 + 旧版形状的无蒙版 recipe,存盘会静默删光整个 Lightroom 蒙版块(2/7 份参考文件的 12/42 条被毁,且注记为空——「导入修得越好,文件越没保护」)。
- v0.30.0 的 recipe 一存盘,会剥掉 Grain / 裁剪后暗角 / 锐化半径,把
crs:Texture="-20"归零(3/7 份真实照片中招,零披露)。
已在 464008a 一次修完(守门判据换成「底片本来就有蒙版块」;新增 schema_era 时代戳 + 27 键的按键豁免门——旧照片上你真拖过的值仍然会写出,因为那才是声明)。随之而来的两项成本已裁决并登记:
- 在 Autoshop 里删光蒙版,不再把删除传播到 sidecar。 要删请在 Lightroom 侧删。本轮的主题就是数据保全高于删除手势。
- 重新发布一个你已经编辑过的蒙版块,会按我方 writer 确定性重铸
MaskName/MaskSyncID。
台账口径更正
- 「803 字形子集」是历史标签。实测
NotoSansSC-autoshop.ttf= 751 字形 / 739 码点,五字体 cmap 并集 2396 码点;本版字体门 801/801。 - v0.28.0 登记的「
BYTES_PER_PIXEL=24既往偏低 ~17%」以第一手算账关闭:三时刻并列核算=恰 24 B/px,当年那是复审者的主张而非实测。常数不动、零行为变更,算账写进了测试。
AI 评测重新基线
147 张 RAW+xmp 对照集全量重跑,147/147 零失败,总分歧 14.2%。最大系统性偏差:whites +22.55、blacks −14.18、noise_reduction +11.71(AI 恒加降噪、用户不加)、highlights +11.69、vibrance +10.80、contrast −7.61;主曲线 RMSE 6.1/255。有意思的是一个补偿模式——AI 在曲线里打对比(S 强度 13.7 vs 用户 3.7),同时在 contrast 滑杆上收着打。色温平均偏冷 163K。分数自 v0.29.0 提示词全档重写后已不可跨版本比较,这一份就是新的正式基线。
评测里还有一行是上面那个缺陷的独立实证:用户侧蒙版「0.00(+2.35 被我方导入器拒收)」——平均每张照片 2.35 个你的蒙版进不来,正是本版修掉的那个数字。
门线
603 lib + 8 CLI + 129 GUI + 2 + 2 合约测试全绿(双配置);clippy --all-targets --bins --features gui 0 警告;audit_i18n 0;字体覆盖 801/801。
仍然开着的(诚实边界)
crs:Angle的符号与旋转基准未经实测——库内实测值域已取到 −43.945287 … +44.792686(43/160 非零),但角度写回臂要等一次 Lightroom 已知角度实验。- 蒙版 Hue / Sharpness 的 Lightroom 数值尺度未实测;
Sharpness0..100 的假设需要一份 >100 的真实样本才能闭。 - Defringe 的渲染近似(乙案)留档备用,本版是携带终态。
- 90° 手动旋转推到 v0.32 首项,完整设计骨架已入库(
docs/ROADMAP.md)。