kCGImageAlphaPremultipliedFirstとkCGImageAlphaFirstの違い
Posted on 2013年3月22日(金) 21:43
UIImageのピクセルにアクセスしようとすると、ピクセルフォーマットがkCGImageAlphaPremultipliedFirstになっています。
(実機では。シミュレーターだと違う! →kCGImageAlphaLastになります)
kCGImageAlphaPremultipliedFirstとkCGImageAlphaFirstはアルファ値が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が間違っている箇所があったので修正しました)
Tweet
ストリーミングは何時になったら実装されるんでしょうか?
私が旧掲示板に要望を挙げてから既に1年以上経ちますが、実装予定のままです。
技術的に実現困難なのであればアナウンスすべきだと思います。
AirComixにMac用サーバーアプリがあればComic Glassに期待する必要もないのですが、更新が停止したままなのでCGに期待するしかない状況です。
実装予定ならどのくらいの期間なのかくらいは大凡のマイルストーンを提示して頂けないでしょうか?