颜色与 Alpha 透明度
理解 Skija 如何处理颜色和透明度对于获得正确的视觉效果至关重要,尤其是在混合多个图层或图像时。
颜色表示
在 Skija 中,颜色最常以 ARGB 格式的 32 位整数表示。
- A (Alpha): 第 24-31 位
- R (Red): 第 16-23 位
- G (Green): 第 8-15 位
- B (Blue): 第 0-7 位
您可以使用 Color 工具类来安全地操作这些值:
java
int myColor = Color.makeARGB(255, 66, 133, 244); // 不透明的蓝色
int transparentRed = Color.withA(0xFFFF0000, 128); // 50% 透明的红色Alpha 类型:预乘与直接
Skia 中最重要的概念之一是 Alpha 类型 (ColorAlphaType)。
预乘 (PREMUL)
这是渲染的默认且推荐的格式。在此格式中,RGB 分量已经乘以了 Alpha 值。
- 为什么? 它使混合速度更快,并防止在过滤或缩放图像时出现“暗边”。
- 示例:一个 50% 透明的白色(Alpha=128, R=255, G=255, B=255)在预乘空间中变为 (128, 128, 128, 128)。
非预乘 (UNPREMUL)
也称为“直接 Alpha”。RGB 分量独立于 Alpha。这是大多数图像文件(如 PNG)存储数据的方式。
- 示例:同样的 50% 透明白色保持为 (128, 255, 255, 255)。
色彩空间
Skija 支持色彩空间感知。虽然您可以使用原始的“朴素”RGB 工作,但为了获得专业效果,您应该指定一个 ColorSpace。
ColorSpace.getSRGB():用于网络和大多数显示器的标准色彩空间。ColorSpace.getDisplayP3():用于广色域显示器(如现代的 Mac 和 iPhone)。
在创建 Surface 或加载 Image 时,始终要考虑色彩空间,以确保在不同设备上外观一致。
最佳实践
- 始终使用预乘 Alpha 进行活动渲染和合成。
- 使用
Color4f当您需要高精度颜色(浮点数)或正在处理广色域色彩空间时。 - 注意 Alpha 模式 在捕获快照或读取像素时;如果您打算将数据保存为标准 PNG,可能需要从
PREMUL转换为UNPREMUL。