Title

2013年3月の投稿一覧

kCGImageAlphaPremultipliedFirstとkCGImageAlphaFirstの違い

UIImageのピクセルにアクセスしようとすると、ピクセルフォーマットがkCGImageAlphaPremultipliedFirstになっています。
(実機では。シミュレーターだと違う! →kCGImageAlphaLastになります)

kCGImageAlphaPremultipliedFirstkCGImageAlphaFirstはアルファ値が32bitの中の一番最初に入っているという意味なのですが、両者にはどのような違いがあるのでしょうか。

これがとても分かりづらいのですが、ピクセルの並びは同じでも入っているものが違います。
Premultipliedの場合は、RGBそれぞれにアルファ値が予め乗算されている、という意味になります。

例えば画素が、

128,128,128 (alpha=0.5)であった場合、

通常のフォーマット(kCGImageAlphaFirst)であれば、
(0.5),128,128,128

Premultipliedの場合であれば、
(0.5),64,64,64

になります・・・・!

これにはもちろん意味があります。
画像Aと画像Bをアルファブレンディングする時の計算式は以下になります。
Wikipedia:アルファブレンド

out.rgb = (src.rgb * src.alpha + dst.rgb * dst.alpha * (1.0 – src.alpha) ) / out.alpha

この式を見ると分かるように、必ず画素にアルファ値が乗算されています。
最後についている除算も左辺に持ってくると乗算になります。

よって、予めRGB値とアルファ値を乗算をしておくことで乗算の回数が減り(もしくは除算を回避でき)、処理を高速化できるのです。(なので名前がPremultiplied)
一般的なビデオカードはこの方式で実装されています。
(副作用としてはアルファ値が0に近いと丸め誤差が増えます)

コーディングの際の注意点としては、画素に直接アクセスしてRGB値を読んでも、実際のRGB値そのものではないということです。
アルファ値の無い画像(アルファがすべて1.0の画像)を扱っている限りは気づきませんが、知らないとけっこうハマります。
ご注意あれ!

(3/23 FirstとLastが間違っている箇所があったので修正しました)

カレンダー

2013年3月
 123
45678910
11121314151617
18192021222324
25262728293031

▲Pagetop