为什么 sRGB 红色 (#FF0000) 在 Display P3 中错误地转换为 #EA3323,然后在我的 Android 屏幕应用程序中错误地转换为 #d84532?

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序(在 Delphi 中),该应用程序加载 sRGB 颜色空间中纯红色 (#FF0000) 的图像。然后将图像解码为位图,并将

inPreferredColorSpace
设置为显示 P3。

这就是我正在做的:

使用 #FF0000 加载 sRGB 图像:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredColorSpace = ColorSpace.get(ColorSpace.Named.DISPLAY_P3);
Bitmap bitmap = BitmapFactory.decodeFile(fileName, options);
Convert the bitmap into an OpenGL texture and draw it on a SurfaceTexture.

问题:加载图像时,我希望 sRGB 红色 #FF0000 转换为其 Display P3 等效项 #EA3323。相反,当我渲染图像时,我最终得到颜色 #d84532#d84532 是 sRGB #EA3323 颜色到显示 P3 的转换)。所以看起来红色(#FF0000)首先在Display P3中转换为#EA3323,然后再次错误地转换为#d84532

为什么会发生这种双重转换?这是否与 OpenGL 或 SurfaceTexture 处理颜色空间的方式有关,如果是,我该如何配置它以避免这种双重转换? 任何建议或解释都会非常有帮助!

android delphi opengl-es android-bitmap color-space
1个回答
0
投票

Android 颜色空间定义了显示器期望的输出颜色空间。

这与 OpenGL ES 将用于输入纹理的颜色空间无关。这将是线性或 sRGB,具体取决于您用于上传纹理数据的格式。

它确实被转换了两次,一次由您转换,然后当图像被传递到显示控制器时再次转换。 ...但是您为什么认为首先需要将输入数据转换为 P3?

© www.soinside.com 2019 - 2024. All rights reserved.