前情提要:通过保持所有 EXIF 数据,替换 JPEG 图像的方法,成功在索尼相机的内屏上显示了测试图像,并测量了它的一些特性。更进一步,这次通过替换预览图的方式,在哈苏的 X2D 100C 上显示了外部图像。
修改直出 JPEG 文件
使用一些哈苏 X2D 拍摄的 JPEG 文件作为样本,分析其文件结构,发现在 APP2 段中存有另一个完整的 JPEG 流,它在文件内的名称为 “/Hasselblad/preview”,这个 JPEG 被用作机内回放时的预览图像,放大后才切换到渲染完整图像。
通过保持原文件的 EXIF,MakerNote,各种 APP 段不变,只替换掉这个预览 JPEG 的图像数据,并把不足的文件长度用 0 补齐,就可以在保持文件结构和偏移量的情况下修改 JPEG 中的预览图。
修改后的文件回到机内,效果是回放时显示修改后的预览图,放大时显示原始图像。

把别的相机拍的图放到哈苏的屏幕上的效果。
简单测量
因为机内回放图片需要手动切换,只能做些少量样本的简单测量,这次选取了 40 个颜色样本。
选择的测试点包括:
- 纯色:R/G/B 轴向各两个(128、255),6 个
- 混合纯色:黄、青、品,6 个
- 灰阶:0–255,步长 17,另外补充了灰阶为 2,4,8,250,253 的样本,共 21 个
- 一些混合的颜色 7 个。
用于评价色域覆盖,灰阶稳定性和 EOTF 传递函数,以及色差。
亮度和对比度
哈苏提供了一个亮度条来控制亮度,拉满后测得的亮度为 1091.0 nits,显示黑色时为 0.72 nits,对比度 1509:1。
白点 xy 色坐标为 (0.3130,0.3291),相关色温 6496 K,非常接近 D65。
色域覆盖和容积
利用三基色的色坐标,可以计算与 sRGB 相比的色域覆盖和容积:
转换到 CIE 1976 UCS 中(也就是 u’v’),计算三角形的面积之比,相比 sRGB 的色域覆盖为 85.10%,色域面积比为 89.07%,在 CIE 1931 xy 上的色域覆盖为 87.42%,面积比 97.23%。

灰阶与传递函数
对比 sRGB EOTF,与索尼内屏恰相反,X2D 100C 的 EOTF 偏高,接近 2.0 的 Gamma 拟合,展现出偏亮的特性,比较符合相机在户外高照度使用的特点。

如果用 Gamma 追踪的方式能够看的更直观,在中高亮度下相比 2.2 的 Gamma 偏低,低亮度下则介于 sRGB 和纯 2.2 Gamma 之间,这也在一定程度上解释了照片导出到更标准的显示器上时,对比度和亮度似乎有所下降的原因。

色差
因为机内直出的图片标记了 sRGB 空间,一块理想的机内显示屏应该符合标准 sRGB,因此以 sRGB 为基准,按显示白色时的亮度进行归一化后,计算除了补充灰阶外的 35 个颜色相比标准 sRGB 的色差值。
按 CIEDE 2000 计算色差,平均 deltaE 为 3.42,最大 deltaE 为 9.79,主要是因为色域覆盖不足导致的,从光谱看机内应该没有色彩管理。


风格化?
对于佳能和哈苏相机来说,我有时候会感觉照片在机内的屏幕上更好看,导出到电脑上,在校过色的显示器上看好像就没有那么好看。准确不一定意味着喜好,既然有时候觉得机内的屏幕上更好看,也测量了这块屏幕的特性,有没有可能把它变成某种风格化的工具呢?
使用简单的非线性映射曲线和矩阵描述哈苏这个屏幕,通过 RGB -(测量的数据)-> XYZ -(标准转换)-> sRGB(或者P3)的方式,将 sRGB 图片模拟出显示在这块屏幕上的效果,粗略来看和机内显示的效果是比较接近的。

这个简单的转换会裁切掉 sRGB 外的部分,并且对于暗部细节的处理不够好,出现了一些死黑的区域,也许可以考虑微调之后做成一个 LUT 使用。
小结
这块哈苏的机内屏幕,在参数上并没有想象的那么优秀,虽然亮度很高,面积不小,对于 EOTF 的处理比较符合室外使用的场景,但色域覆盖和色准稍显逊色,X2D II 上的那块 OLED 屏幕应该有更好的色域和色准表现。
如果很多用户喜欢机内屏幕的效果的话(比如佳能),不妨考虑把这块屏幕的特性测量出来,做成一种风格化的工具,也能够减少在不同显示设备上看照片时的落差感。
附录:关于直出 JPEG
一些关于直出 JPEG 文件的更多细节,由 GPT-5.5 分析整理,仅供参考。
样本文件结构
| 字段 | 值 |
|---|---|
| Make | Hasselblad |
| Model | X2D 100C |
| Software | 3.2.0 |
| 主图尺寸 | 11656 x 8742 |
| 主图像素 | 约 101.9 MP |
| JPEG 类型 | Baseline DCT, Huffman coding |
| BitsPerSample | 8 |
| ColorComponents | 3 |
| YCbCrSubSampling | YCbCr4:2:2 (2 1) |
| ColorSpace | sRGB |
| JPEGQualityEstimate | 97 |
三张主图的量化表和霍夫曼表一致,exiftool 给出的 JPEGDigest 一致。
样本的主结构大致如下:
SOI
APP1 Exif
APP1 XMP
APP2 FPXR contents list
APP2 FPXR stream data segment 0
APP2 FPXR stream data segment 1
...
COM zero padding
APP0 JFIF
DQT
DQT
SOF0
DHT
DHT
DHT
DHT
SOS
main image entropy-coded data
EOI
trailer
APP2 FPXR 与 /HASSELBLAD/preview
三个样本都包含 APP2 段,payload 以:
46 50 58 52 00
开始,也就是 ASCII:
FPXR\0
这是 FlashPix Ready 的 APP2 多段封装。contents list 中有两个条目:
/HASSELBLAD
/HASSELBLAD/preview
其中 /HASSELBLAD/preview 是一个完整的 JPEG 文件流。
Preview JPEG 属性
三张样本中的 /HASSELBLAD/preview 都是:
| 字段 | 值 |
|---|---|
| JPEG 起始 | ff d8 |
| JFIF | 有 |
| 类型 | Baseline JPEG |
| Bits | 8 |
| 尺寸 | 3888 x 2918 |
| 采样 | 2x1,1x1,1x1,即 4:2:2 |
4KB 对齐
主图的 COM,Preview 的 EOI 后,以及文件末尾都有一些零填充,似乎是为了把主图 JPEG 头部,Preview 的 Stream 长度以及整体长度都对齐到 4KB 的边界上。