如何判断当前的AMOLED屏幕模式?
How to determine current AMOLED screen mode?
许多 Android 配备 AMOLED 屏幕的设备默认显示所有颜色过饱和的图像。例如。 Samsung Galaxy 手机具有“自适应”屏幕模式,这会强制 windows 所有应用程序以原生屏幕颜色 space 呈现,比 Display-P3 更宽。
OTOH,并非所有此类设备都支持 EGL_EXT_gl_colorspace_display_p3
,无论屏幕模式如何,因此我无法确定我的应用 运行 所在的设备是否具有广色域屏幕,更不用说判断这个模式是不是默认了
那么,我如何真正确定当前屏幕模式是 sRGB 还是某种广色域模式?我的目标是一种特定的设备型号,Samsung Galaxy A320F/DS(又名“A3 (2017)”),因此特定于平台的方法也可以。
有几个图层可以操作颜色。
SurfaceFlinger
。此组件对所有 Android 系统通用。可以通过例如将自定义颜色矩阵传递给它(参见 source code of the handler of this request)以下命令作为 root
用户执行:
service call SurfaceFlinger 1015 i32 1 \
f 0 f 0 f 1 f 0 \
f 0 f 1 f 0 f 0 \
f 1 f 0 f 0 f 0 \
f 0 f 0 f 0 f 1
上面的示例命令设置了一个矩阵,该矩阵作用于 RGBA 向量,交换红色和蓝色通道。要将自定义矩阵重置为默认值(身份),您只需执行
service call SurfaceFlinger 1015 i32 0
你也许可以在没有 root 权限的情况下从 Java/JNI 应用程序执行所有这些操作,只需请求一些权限,我没有研究这个。
- mDNIe,代表移动数字自然图像引擎。这是一个三星专用系统,其运行级别低于
SurfaceFlinger
。也就是说,它会影响 Always On Display,SurfaceFlinger
的自定义颜色矩阵对其没有任何影响。
当前屏幕模式可以在 /sys/class/mdnie/mdnie/mode
文件中看到,该文件在 Galaxy A320F/DS 上似乎具有以下值映射:
0
— AMOLED cinema(貌似是针对Display-P3),
1
— AMOLED 照片(显然是针对 Adobe RGB),
2
— 基本(针对 sRGB),
3
—(不知道它的用途,但如果写入 mode
则该值被接受)
4
— 自适应显示(最宽的,显然是原生屏幕颜色 space)。
5
—(不知道它的用途,但如果写入 mode
则该值被接受)
此外,颜色还受冷 — 暖 滑块以及高级选项 RGB 每通道调整。对前者的更改以某种方式反映在同一目录中的 mdnie_ldu
和 sensorRGB
文件中,而后者直接对应 whiteRGB
文件。
此外,蓝光滤镜功能状态反映在night_mode
文件中(它也影响上述mdnie_ldu
和sensorRGB
文件).
在上述文件中,只有 mode
是非 root
用户可读的。
许多 Android 配备 AMOLED 屏幕的设备默认显示所有颜色过饱和的图像。例如。 Samsung Galaxy 手机具有“自适应”屏幕模式,这会强制 windows 所有应用程序以原生屏幕颜色 space 呈现,比 Display-P3 更宽。
OTOH,并非所有此类设备都支持 EGL_EXT_gl_colorspace_display_p3
,无论屏幕模式如何,因此我无法确定我的应用 运行 所在的设备是否具有广色域屏幕,更不用说判断这个模式是不是默认了
那么,我如何真正确定当前屏幕模式是 sRGB 还是某种广色域模式?我的目标是一种特定的设备型号,Samsung Galaxy A320F/DS(又名“A3 (2017)”),因此特定于平台的方法也可以。
有几个图层可以操作颜色。
SurfaceFlinger
。此组件对所有 Android 系统通用。可以通过例如将自定义颜色矩阵传递给它(参见 source code of the handler of this request)以下命令作为root
用户执行:
service call SurfaceFlinger 1015 i32 1 \
f 0 f 0 f 1 f 0 \
f 0 f 1 f 0 f 0 \
f 1 f 0 f 0 f 0 \
f 0 f 0 f 0 f 1
上面的示例命令设置了一个矩阵,该矩阵作用于 RGBA 向量,交换红色和蓝色通道。要将自定义矩阵重置为默认值(身份),您只需执行
service call SurfaceFlinger 1015 i32 0
你也许可以在没有 root 权限的情况下从 Java/JNI 应用程序执行所有这些操作,只需请求一些权限,我没有研究这个。
- mDNIe,代表移动数字自然图像引擎。这是一个三星专用系统,其运行级别低于
SurfaceFlinger
。也就是说,它会影响 Always On Display,SurfaceFlinger
的自定义颜色矩阵对其没有任何影响。
当前屏幕模式可以在/sys/class/mdnie/mdnie/mode
文件中看到,该文件在 Galaxy A320F/DS 上似乎具有以下值映射:0
— AMOLED cinema(貌似是针对Display-P3),1
— AMOLED 照片(显然是针对 Adobe RGB),2
— 基本(针对 sRGB),3
—(不知道它的用途,但如果写入mode
则该值被接受)4
— 自适应显示(最宽的,显然是原生屏幕颜色 space)。5
—(不知道它的用途,但如果写入mode
则该值被接受)
此外,颜色还受冷 — 暖 滑块以及高级选项 RGB 每通道调整。对前者的更改以某种方式反映在同一目录中的 mdnie_ldu
和 sensorRGB
文件中,而后者直接对应 whiteRGB
文件。
此外,蓝光滤镜功能状态反映在night_mode
文件中(它也影响上述mdnie_ldu
和sensorRGB
文件).
在上述文件中,只有 mode
是非 root
用户可读的。