Title

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が間違っている箇所があったので修正しました)

コメント / トラックバック 2 件

:CGユーザー| 2013/04/28 01:49

ストリーミングは何時になったら実装されるんでしょうか?
私が旧掲示板に要望を挙げてから既に1年以上経ちますが、実装予定のままです。
技術的に実現困難なのであればアナウンスすべきだと思います。
AirComixにMac用サーバーアプリがあればComic Glassに期待する必要もないのですが、更新が停止したままなのでCGに期待するしかない状況です。
実装予定ならどのくらいの期間なのかくらいは大凡のマイルストーンを提示して頂けないでしょうか?

:HottaRyusuke| 2013/06/18 10:35

具体的期間はなかなかお応えできず申し訳ないのですが、すでに手元では動作しています。
テストを含めるともうしばらくかかるとおもいますが、数ヶ月以内にはリリースできる見込みです。
すみません。

Leave a Reply

E-Mail (will not be published)
Comment
*

カレンダー

2024年4月
1234567
891011121314
15161718192021
22232425262728
2930  

▲Pagetop