関連トピック(まだ解決策なし):ARGB_8888Androidビットマップの生データへのアクセス
つまり、copyPixelFromBuffer
とを使用する場合copyPixelsToBuffer
、AndroidはすでにRGBチャンネルにアルファチャンネルを適用しています。
元のARGB値に変換する必要があります。その逆も同様です。Androidがどのように適用するのかわかりません。計算式を教えてください。
Android は、ビットマップ データを事前乗算されたアルファ形式で保存します。つまり、アルファ値はデータのコピー時に適用されず、常に適用されています。
乗算済みの形式に変換するには、次のように、色成分に正規化されたアルファ値を乗算します。
redPremultiplied = red * normalizedAlpha
greenPremultiplied = green * normalizedAlpha
bluePremultiplied = blue * normalizedAlpha
alphaPremultiplied = alpha
どこ
red = <value between 0 and 255>
green = <value between 0 and 255>
blue = <value between 0 and 255>
alpha = <value between 0 and 255>
normalizedAlpha = alpha / 255
事前に乗算されたアルファから正準形式に変換するには、事前に乗算されたコンポーネントを正規化されたアルファで除算します。
red = redPremultiplied / normalizedAlpha
green = greenPremultiplied / normalizedAlpha
blue = bluePremultiplied / normalizedAlpha
alpha = alphaPremultiplied
ただし、normalizedAlpha = 0 に注意してください。ただし、によって処理されるデータはBitmap.copyPixelsToBuffer()
、Bitmap.copyPixelsFromBuffer()
理論的にはどのような形式でもかまいません。API は、これらの関数によって処理されるデータの形式について保証されるため、Bitmap.getPixels()
およびを使用する方が安全です。Bitmap.setPixels()
特に、アルファの事前乗算と事前乗算解除について心配する必要はありません。これらの関数がそれを処理するからです。