默认情况下,许多带有AMOLED屏幕的Android设备显示所有颜色过饱和的图像。 例如,三星Galaxy手机具有"自适应"屏幕模式,该模式强制显示所有应用程序的窗口,就像它们在本机屏幕色彩空间中呈现一样,该空间比Display-P3宽。
OTOH,并非所有此类设备都支持EGL_EXT_gl_colorspace_display_p3
,无论屏幕模式如何,所以我无法确定运行我的应用程序的设备是否具有宽色域屏幕,更不用说确定此模式是否是默认模式。
那么,如何实际确定当前屏幕模式是sRGB还是某些广色域模式?我的目标是一种特定的设备型号,三星Galaxy A320F/DS(又名"A3(2017("(,因此特定于平台的方式也可以。
有几个图层可以操作颜色。
SurfaceFlinger
.此组件对于所有安卓系统都是通用的。可以通过例如作为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
。也就是说,它会影响始终显示,SurfaceFlinger
的自定义颜色矩阵对此没有任何影响。
当前的屏幕模式可以在/sys/class/mdnie/mdnie/mode
文件中看到,该文件似乎具有Galaxy A320F/DS上的以下值映射:0
- AMOLED电影院(显然针对Display-P3(,1
- AMOLED照片(显然针对Adobe RGB(,2
— 基本(针对sRGB(,3
— (不知道它的目的,但如果写给mode
,这个值是可以接受
的(4
— 自适应显示(最宽的、显然是本机屏幕色彩空间(。5
— (不知道它的用途,但如果写给mode
,这个值是可以接受的(
此外,颜色还受到"冷-暖"滑块以及高级选项RGB每通道调整的影响。对前者的更改以某种方式反映在同一目录中的mdnie_ldu
和sensorRGB
文件中,而后者直接对应于whiteRGB
文件。
此外,蓝光滤镜功能状态反映在night_mode
文件中(它还影响上述mdnie_ldu
和sensorRGB
文件(。
在上述文件中,只有mode
对 SM-A320F/DS 上的非root
用户可读。在SM-G950FD(又名"S8"(上,如果没有root
,则无法访问任何内容。