Skip to content

颜色与 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 时,始终要考虑色彩空间,以确保在不同设备上外观一致。

最佳实践

  1. 始终使用预乘 Alpha 进行活动渲染和合成。
  2. 使用 Color4f 当您需要高精度颜色(浮点数)或正在处理广色域色彩空间时。
  3. 注意 Alpha 模式 在捕获快照或读取像素时;如果您打算将数据保存为标准 PNG,可能需要从 PREMUL 转换为 UNPREMUL