ただ、理論的には:どのようにアルファ成分は、iPhone OSでのPNGの他のコンポーネントにあらかじめ乗算され、そしてどのようにそれが適切にunpremultipliedすることができますか?
-
22-08-2019 - |
質問
実は、私はそれを達成するための簡単な方法があるだろうと思いました。私に必要なのは、純粋なアルファ値情報です。試験のために、私はすべてのエッジで5×5画素の矩形が完全に透明であり、50×55ピクセルのPNGを有します。これらの地域では、アルファは、それは私が私のPNGが正しく作成されていることを非常に確認しました255でなければならない0.Everywhereは他にする必要があり、それはまた、正常に見えます。
これは理論的に正しいかどうかを教えてください: 私はアルファチャンネルと他には何を持っているCGImageRefを作成しました。これは、PARAMとしてCGBitmapContextCreateとkCGImageAlphaOnlyで行われます。 CGBitmapContextGetBitsPerPixel(コンテキスト)は私1を返し、それは私が実際にピクセルごとに1つだけの成分があることを私に示して:所望のアルファ値。 私はCGBitmapContextCreateが新しい作成されたコンテキストに与えられた画像からすべての変換を処理することを読んでいました。私のイメージでは、以前に透明で-24をPNGたが、Xcodeのからpngcrunchは何とかそれらを変換しているようだ。
それでは、理論的に:私はこの時点では正しい、unpremultipliedアルファを取得するためにあらゆる機会を持っていますか?私が取得値は、ほぼ一致するように見えるが、私はそうで19、197、210、0、0、0、98などの値を取得し、大きな5x5の透明平方インチ彼らは本当だったら、私は画像から何かを見なければならないでしょう。画像自体が固体青色である。
解決
プリマルチプライは、カラーチャンネルに影響を与える、アルファチャンネルに影響を及ぼさない。
ラスタ合成(別の上に1つのラスタイメージを置く)ための式である:
dst.r = src.r * src.a + dst.r * (1.0 - src.a);
dst.g = src.g * src.a + dst.g * (1.0 - src.a);
dst.b = src.b * src.a + dst.b * (1.0 - src.a);
第1の乗算表現アウトプリマルチプライカットます:
dst.r = src.r′ + dst.r * (1.0 - src.a);
dst.g = src.g′ + dst.g * (1.0 - src.a);
dst.b = src.b′ + dst.b * (1.0 - src.a);
ソース色成分は既にアルファ成分、したがって名「あらかじめ乗算」が乗算されるので、この作品。それはすでに結果を持っているので、ここでそれらを乗算する必要はありません。
unpremultipliedアルファ
アルファ成分自体あらかじめ乗算されることはありません:何を掛けでしょうか? 色の成分はアルファであらかじめ乗算されている。
他のヒント
色値をpremultiplyingするよう簡単であるので
r = (r * a) / 255;
g = (g * a) / 255;
b = (b * a) / 255;
逆を取得することになります:
if (a > 0) {
r = (r * 255) / a;
g = (g * 255) / a;
b = (b * 255) / a;
}
このformularが正しくありません。目標は同じ多重値に後者の結果は、(しかし、元のR、G、B値を見つけることができないだろう。
unmultiplexed(B、R、Gなど)を見つけることですしかし、我々は例を見つける上でformularと
alpha = 100
r_premulti = 1
再構成R = 2;
このrが再び多重化されている場合は、後者は、我々は2 * 255分の100 = 0見つけるが、我々はその代わりr_premulti == 1が欲しかった!!
正しいformularは、のはの切り上げが必要です。 R成分の例:
reconstruced r = ceiling(r_premulti * 255 / alpha)