给相机添加 65:24 XPAN宽画幅(非官方实现方式)
选择宽幅后:
- 取景框按 65:24 两边加黑边,取景时看到的就是最终成片的构图;
- 拍出来的照片自动居中裁成 65:24比例
- 照片不带水印
其余画幅(4:3、1:1、16:9 全屏 等)不受任何影响
宽幅是怎么实现的
相机本身没有 65:24 这个比例,底层也不支持直接输出 65:24。所以模块采用「把成片加工裁成宽幅,曲线救国」的路线
一、让画幅选项出现「宽幅」 相机内置了一份「哪些模式支持宽幅」的配置,默认把这一项藏起来。模块在相机读取这份配置、以及决定选项是否可见时把它放开,画幅选项即出现宽幅。
二、取景框按 65:24 取景 预览画面本身仍是相机输出的 4:3,相机把它放大居中裁切填满了全屏。模块不缩放预览,选择在两侧盖上黑条,把可见范围收成一条 24:65 的竖带——横过来看就是 65:24 的宽幅。此举使得取景框与成片一致,所见即所得
三、成片居中裁成 65:24 相机拍完写盘时,模块在写文件的环节把照片居中裁成 65:24。裁剪会保留相机写入的 EXIF、Ultra HDR 增益图和 XMP / MPF 声明,画质和动态范围不受影响
四、兜底 万一某张照片绕过了上面的写盘环节,后台还有一个线程扫相册目录,将漏裁的宽幅照片补裁
此线程平时不扫盘,只在检测到宽幅拍摄信号后 60 秒窗口内才开始 list 目录。窗口一过就回到“每 3 秒一次纯内存判断”的休眠态;线程随相机进程生死,没有独立服务、没有 wakelock。代价是一个常驻 daemon 和每 3 秒一次微秒级唤醒,可得到漏裁照片自动补裁的好处
Q:为什么宽幅照片没有水印
A:相机的机型水印是在成片之后、由相册那条链加上去的,它会读照片里的水印开关;宽幅模式下,模块在相机读这个开关时回答「关」,所以宽幅照片不会带水印。
解释:若是带水印,带有水印的图片被裁剪,使水印变得不和谐且无法编辑(例如去除水印),故模块将宽幅拍摄时相机水印设置为“关”。后续仍可在相册自行添加水印
此改动仅对宽幅生效,在其他画幅时,相机水印设置界面开关状态将遵循用户设置
Q:为什么高效图片存储对宽幅无效
A:相机设置里的「高效图片存储」会让照片以 HEIC 格式保存,打开它之后,普通画幅的照片是 HEIC,但宽幅照片仍然是 JPEG。
原因是两条落盘路径不一样:
- 普通画幅的照片,相机是在 Java 层把像素交给编码器写盘的,模块可以在这一层把它裁成 65:24;
- HEIC 是由相机自己的底层编码器直接写盘的,模块拿不到那一步的像素,也就没法在编码前裁剪
所以模块换了个位置下手:等 HEIC 文件落盘之后,把它读出来、居中裁成 65:24,再以同名 JPEG 重新写回。同时把方向、拍摄时间、光圈、快门、ISO、焦距、镜头这些参数一并搬过去,原 HEIC 删除
结果是宽幅照片变成了 JPEG。这是为了保住裁剪而做的取舍——如果不换格式,宽幅在开启高效图片存储时就只能保持全画幅、不裁剪(不如自己全屏拍照后去相册裁成XPAN比例)
Q:为何没有宽幅实况?
A:非官方实现方式,成片是后裁的,实况自然被裁掉了