2

RGB1 * A1 + RGB2 * A2ほど単純ではないようです...値はどのようにクリップされますか?加重?等。

そして、これはコンテキスト依存の質問ですか?異なる結果を生み出す異なるアルゴリズムはありますか?または1つの標準実装?

私はOpenGL固有の回答に特に興味がありますが、他の環境からのコンテキストも役立ちます。

4

2 に答える 2

7

OpenGL についてはわかりませんが、不透明度 A の 1 つのピクセルは通常、次のように別のピクセルに描画されます。

result.r = background.r * (1 - A) + foreground.r * A
result.g = background.g * (1 - A) + foreground.g * A
result.b = background.b * (1 - A) + foreground.b * A

この操作を複数のピクセルに対して繰り返します。

于 2012-05-26T18:41:57.170 に答える
5

上記の答えは、画像が事前乗算されたアルファでない場合に機能します。ただし、事前に乗算されたアルファ イメージでそのタイプのブレンドを使用すると、黒い境界線が表示されます。

乗算済みアルファ:

イメージが作成されると、カラー値にアルファ チャネルが乗算されます。この 1 ピクセルの例を見てください。

Pixel: r = 1, g = 0, b = 0, a = 0.5

保存すると、rgb 値にアルファ値が乗算され、次のようになります。

Pixel: r = 0.5, g = 0, b = 0, a = 0.5

この種の画像をブレンドするには、次の式を使用する必要があります。

result.r = background.r * (1 - A) + foreground.r
result.g = background.g * (1 - A) + foreground.g
result.b = background.b * (1 - A) + foreground.b

あらかじめ乗算されていないアルファ

この例では、アルファ チャネルはカラー チャネルから完全に分離されています。

Pixel: r = 1, g = 0, b = 0, a = 0.5

保存すると:

Pixel: r = 1, g = 0, b = 0, a = 0.5

それは同じだ。この場合、ミニテックが提供する答えは正しいです。

詳細については、こちらを参照してください: Premultiplied alpha

于 2014-04-05T15:16:17.653 に答える