との違いを教えていただけますkCGImageAlphaPremultipliedFirst
かkCGImageAlphaFirst
?Premultiplied
実際にはどういう意味ですか?
1 に答える
つまり、事前に乗算されているということは、不透明でないピクセルが表現されている場合に、アルファ値がピクセルの色成分値にも影響を与えることを意味します。
Quartz 2D 描画ガイドから:
アルファ コンポーネントを持つビットマップの場合、カラー コンポーネントが既にアルファ値で乗算されているかどうか。Premultiplied alpha は、コンポーネントが既にアルファ値で乗算されているソース カラーを表します。前乗算は、色成分ごとの余分な乗算操作を排除することで、イメージのレンダリングを高速化します。たとえば、RGB カラー スペースでは、あらかじめ乗算されたアルファを使用してイメージをレンダリングすると、イメージ内の各ピクセルの 3 つの乗算操作 (赤にアルファ、緑にアルファ、青にアルファ) が不要になります。
ところで、Pre-Multiplied は、Quartz の好みであるため、API が強制的に使用する可能性があります。幸いなことに、変換はひどいものではありません (ロッシー OTOH …)。
これを説明する最も簡単な方法はfloat
、範囲を使用してコンポーネントで説明することです[0...1]
。
RGBA 入力表現が次の場合:
typedef struct t_rgba { float r,g,b,a; } t_rgba;
const t_rgba rgba = { 0.5, 0.5, 0.5, 0.5 };
次に、それを事前に乗算します。
t_rgba rgba_PreMul = rgba;
rgba_PreMul.r *= rgba_PreMul.a;
rgba_PreMul.g *= rgba_PreMul.a;
rgba_PreMul.b *= rgba_PreMul.a;
次に、事前乗算を解除します。
t_rgba rgba_DePreMul = rgba_PreMul;
if (0.0 < rgba_DePreMul.a && 1.0 > rgba_DePreMul.a) {
const float ialpha = 1.0/rgba_DePreMul.a;
rgba_DePreMul.r *= ialpha;
rgba_DePreMul.g *= ialpha;
rgba_DePreMul.b *= ialpha;
}
そこにも彩度が必要な場合があります。
これが基本的な形式で、他の数値表現に転用できます。これらの変換は不可逆であることに注意してください。同様に、通常のビットマップが期待される場所にあらかじめ乗算されたビットマップを渡さないように注意してください。