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