#1 - 2021-12-18 19:59
magsom (Digital Lumpen Proletariat)
2021年快过去了,虽然各路硬件厂商一直在推广 HDR(高动态范围) 显示硬件,但是现实中日常软件(例如各种图片浏览器)对 HDR 显示的支持依旧不理想。

图片是网页上最常使用的媒体元素,然而几乎所有的网页浏览器和各种网站都不支持 HDR 图片。
MDN 网站开发文档介绍的网络浏览器支持的图片格式中,AVIF、PNG和TIFF都支持 HDR。Webp2 支持10位 HDR 但还在开发中。

AVIF 支持8、10、12位 AYUV444,支持ICC色彩配置文件和色彩标记 CICP(Coding-independent code points,独立于编码的代码点,也叫NCLX)。目前谷歌 Chrome 和 Chromium 96 支持 AVIF 的 HDR 显示,但很遗憾在我的 Windows 11 电脑和 Android 11 手机上都无法正确显示。有篇博文表示他成功过。
Firefox 97 火狐浏览器支持 AVIF 但不支持10、12位色彩和 HDR 显示。微软 Edge 96 浏览器不支持 AVIF。
测试图:

PNG 和 TIFF 支持16位色深和 ICC 色彩配置文件,但浏览器可能不支持 HDR 显示。
ICC 配置文件不普及的可能原因:
1、容量大。对于大量小图片有时却需要嵌入比图片本身还大的配置文件,加载时间变长。
2、版权。一些 ICC 配置文件有版权限制。
3、在各种软件和系统间使用不同的色彩管理引擎(CMS)可能会产生不同的结果。


HDR 图像的创建和编辑
Windows 上的 Xbox 游戏栏支持 HDR 截图,格式为 16 位浮点 RGBA,线性 scRGB,HDR 的 JPEG XR。根据微软文档 Using DirectX with high dynamic range Displays and Advanced Color 可了解,Windows 电脑系统在开启 HDR 显示时,DWM 桌面窗口管理器使用16位浮点线性 scRGB 色彩空间进行合成,这样的好处是兼容旧软件的 sRGB 内容。文档说 DXGI 还有 HDR10 的表面格式,透明度只有2位,只用于最终画面输出。
看来16、32位浮点线性空间是画面合成主要使用的中间格式,而最终输出主要用 10、12 位整数非线性空间之类的电视、显示器格式。
Xbox 游戏栏的截图会将 SDR 内容编码为 200 尼特,不对应系统设置里的 SDR 内容亮度设置。(200 尼特对应的 SDR 亮度设置值是 30,scRGB 浮点值是2.5。)
支持 JXR 格式的软件太少,软件有如下:
查看器 HDR + WCG Image Viewer    源码
商业图片编辑软件 Affinity Photo
命令行和软件库 jxrlib。

要是微软照片和 Edge 浏览器都能直接支持 JXR HDR 图片的话,JXR的普及率应该能直接上升一大截。

下面介绍一下使用开源软件将 JXR 截图转换为 AVIF 的流程。

1、安装 jxrlib、libavif、Krita
Windows 上可以使用 MSYS2 或 Windows Linux 子系统来安装前2个软件包。

2、将JXR转换为TIFF
JxrDecApp -i .jxr -o .tif 


3、转换色彩空间
Krita 绘图软件有转换图片色彩空间的功能,但首先需要进行一些繁琐的设置。
在设置(N) -> 配置 Krita(C)... -> Python 插件管理设置界面,勾选 Assign Profile To Image。
在设置(N) -> 配置 Krita(C)... -> 显示 -> HDR 选项设置首选输出格式为 Rec. 2020 PQ (10 bit) (选择 Rec. 709 Linear (16 bit) 不能正常显示)。
重启 Krita。
打开 TIFF 文件,选择工具(T) -> 脚本 -> 图像色彩特性文件指定,选择 scRGB (linear)。此时图片应该能显示正确的颜色。
(如果 ICC 元数据能在各种网络浏览器和编解码器中的各种色彩管理引擎中正常工作的话,现在直接选择另存为就可以了,但现实是很多影像软件并不包含色彩管理引擎。参考帖子
(如果你需要 HDR 绘图,在小型拾色器中调整亮度就可以选取极亮颜色进行绘画,具体参考Krita文档
选择图像(I) -> 图像属性(P) -> 图像色彩空间,通道深度选择16位整数,特性文件(L)选择 ”Hign Dynamic Range UHDTV Wide Color Gamut Display (Rec.2020)“
保存为PNG,勾选保存为 HDR 图像 (Rec.2020 PQ)。(这一步色彩空间转换好像重复了,所以不用上一步也行)

4、PNG转换为AVIF
参考CICP
avifenc --lossless --ignore-icc --cicp 9/16/9 --depth 10 .png .avif

无损,不附加ICC元数据,BT2100 PQ CICP,位深10位(12位应该 CICP 也一样)。
(这里没有加上可选的 MaxCLL 最大亮度元数据。Windows 上部分全屏的 HDR 应用会直接发送亮度元数据到显示器用于调整色调映射,然而显示器会调整整个屏幕导致退出全屏后 SDR 内容显示不正常,不兼容窗口化的HDR显示。还有一种方案就是将应用画面发送到DWM,由 DWM 合成最终画面和发送元数据,不知道 DWM 现在支持的怎么样。DisplayHDR Test 软件里有 ST.2084 Spike 色调映射测试,需要全屏才能测试。)
无损可能会使画面变紫色,而且编码速度很慢。
制作动图和制作视频的流程差不多,avifenc 要求的输入格式是 y4m(yuv4mpeg),因为无压缩所以容量会很大,建议先使用别的无损压缩格式,然后使用FFmpeg 的 yuv4mpegpipe 输入到 avifenc --stdin。
Krita 也支持动画功能,在设置(N) -> 面板列表(D) -> 时间轴创建动画帧后可在主菜单文件(F)导出动画。


闲话
虚幻引擎5编辑器支持 DX11 窗口 HDR 显示,以前只支持独占全屏。(更新:我看了源码,实际上 DX11 RHI 还是不支持窗口化 HDR,只支持NVIDIA和AMD专有接口的独占全屏,窗口化HDR只有DX12才支持,DX12不支持独占全屏)
Krita 和虚幻引擎等等专业影像软件都支持 OpenColorIO 色彩管理引擎,我还没用过。
最终幻想7打开 HDR 效果比 SDR 好太多了!
#2 - 2021-12-19 19:52
(Digital Lumpen Proletariat)
Krita 5.0 (发行说明) 支持了 AVIF 格式的读写,但是 5.0 还没发布正式版。
#3 - 2021-12-19 20:12
问下,“真HDR”的电脑显示器在21年底最便宜的要多少钱?
#3-1 - 2021-12-19 21:05
magsom
我推荐还是直接买高端电视,显示器溢价太严重。
真HDR指 DisplayHDR1000 认证的话当时最便宜的飞利浦436M6VBPAB 现在要4000元。
更多型号你可以在这里找https://displayhdr.org/certified-products
#3-2 - 2021-12-19 21:43
stotle
magsom 说: 我推荐还是直接买高端电视,显示器溢价太严重。
真HDR指 DisplayHDR1000 认证的话当时最便宜的飞利浦436M6VBPAB 现在要4000元。
更多型号你可以在这里找https://dis...
感谢,看来离普及还有一步之遥。