色とアルファ透過度
Skija が色と透過度をどのように扱うかを理解することは、特に複数のレイヤーや画像をブレンドする際に、正しい視覚的結果を得るために不可欠です。
色の表現
Skija では、色は ARGB 形式の 32 ビット整数として最も一般的に表現されます。
- A (アルファ): ビット 24-31
- R (赤): ビット 16-23
- G (緑): ビット 8-15
- B (青): ビット 0-7
Color ユーティリティクラスを使用して、これらの値を安全に操作できます:
java
int myColor = Color.makeARGB(255, 66, 133, 244); // 不透明な青
int transparentRed = Color.withA(0xFFFF0000, 128); // 50% 透過の赤アルファタイプ: 事前乗算済み vs ストレート
Skia における最も重要な概念の一つが アルファタイプ (ColorAlphaType) です。
事前乗算済み (PREMUL)
これはレンダリングにおける デフォルトかつ推奨される フォーマットです。このフォーマットでは、RGB コンポーネントはすでにアルファ値が乗算されています。
- なぜ? ブレンディングを大幅に高速化し、画像のフィルタリングやスケーリング時の「暗い縁」を防ぎます。
- 例: 50% 透過の白 (Alpha=128, R=255, G=255, B=255) は、事前乗算済み空間では (128, 128, 128, 128) になります。
非事前乗算済み (UNPREMUL)
「ストレートアルファ」とも呼ばれます。RGB コンポーネントはアルファから独立しています。これは多くの画像ファイル (PNG など) がデータを保存する方法です。
- 例: 同じ 50% 透過の白は (128, 255, 255, 255) のままです。
カラースペース
Skija はカラースペースを認識します。生の「素朴な」RGB で作業することもできますが、プロフェッショナルな結果を得るためには、ColorSpace を指定する必要があります。
ColorSpace.getSRGB(): Web やほとんどのモニターの標準カラースペース。ColorSpace.getDisplayP3(): 広色域ディスプレイ (最新の Mac や iPhone など) 用。
Surface を作成したり Image を読み込む際は、異なるデバイス間で一貫した見た目を保証するために、常にカラースペースを考慮してください。
ベストプラクティス
- アクティブなレンダリングと合成には常に事前乗算済みアルファを使用する。
- 高精度の色 (浮動小数点) が必要な場合や、広色域カラースペースを扱う場合は、
Color4fを使用する。 - スナップショットをキャプチャしたりピクセルを読み取る際は、アルファモードに注意する。データを標準的な PNG として保存する予定がある場合は、
PREMULからUNPREMULへの変換が必要になる場合があります。