色彩與 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。