前乗算されたアルファ

コンピューター グラフィックスでは、色の値の不透明度を表す 2 つの異なる方法があります。 Win2D では、両方のメソッドが使用されます。 この記事では、違いについて説明し、ここで使用します。

直線アルファ

直線 (線形、アルファとも呼ばれます) を使用する場合:

  • RGB 値は、描画されるオブジェクトの色を指定します
  • アルファ値は、それがどのように固体であるかを指定します

この世界では、RGB とアルファは独立しています。 もう一方に影響を与えることなく、1 つを変更できます。 オブジェクトをフェードアウトするには、RGB を変更せずにアルファ値を徐々に小さくします。

直線アルファ形式を使用する 2 つの色の間でソースオーバー ブレンドを実行するには:

result = (source.RGB * source.A) + (dest.RGB * (1 - source.A))

前乗算されたアルファ

事前乗算されたアルファを使用する場合:

  • RGB は、描画されるオブジェクトが出力にどの程度の色を与えるかを指定します
  • アルファ値は、その背後にあるものを隠す量を指定します

この世界では、RGB とアルファがリンクされています。 オブジェクトを透明にするには、RGB (より少ない色を提供するため) とアルファ (背後にあるものを隠すために) の両方を減らす必要があります。 完全に透明なオブジェクトは色をまったく持たなくなったため、100% の透明度を表す値は 1 つだけです(RGB とアルファのすべて 0)。

事前乗算されたアルファ形式を使用する 2 つの色の間でソースオーバー ブレンドを実行するには:

result = source.RGB + (dest.RGB * (1 - source.A))

事前乗算されたアルファは、画像のフィルター処理や異なるレイヤーの作成時に直線アルファよりも優れた結果を得るため、グラフィックス レンダリングで使用されます。 詳細については、次のブログ記事を参照してください。

Win2D でのアルファ

Win2D は API サーフェイスで直線アルファを使用しますが、内部レンダリング操作には事前乗算されたアルファを使用します。

Windows.UI.Color 値は直線アルファを使用します。 Draw*またはFill*メソッドに色を渡したり、ブラシの色を設定したり、色の値をクリアしたりするたびに、この色は直線アルファを使用して指定されます。

ビットマップまたはレンダーターゲットに格納されているピクセル値、およびこれらのサーフェスで動作する描画またはブレンド操作では、事前乗算されたアルファが使用されます。 ビットマップがファイルから読み込まれると、その内容は自動的に事前乗算形式に変換されます。 Win2D 描画メソッドを呼び出すと、実際の描画が行われる前に、そのカラー パラメーターが直接から事前乗算に変換されます。

Win2D 画像効果では、ストレートアルファとプリマルチプライ済みアルファの組み合わせが使用されます。 一部の効果は 1 つの形式で動作し、一部は他方の形式で動作し、一部は選択するプロパティを提供します。 各効果の種類のドキュメントでは、どのアルファ モードを使用するかについて説明します。 エフェクト入力データは常にプリマルチプライドと見なされるため、効果が直線アルファで動作する必要がある場合は、最初に未乗算変換を適用し、効果を計算してから、出力を再乗算します。

ビットマップ API GetPixelBytesSetPixelBytesGetPixelColors、および SetPixelColorsでは、アルファ形式の変換 実行 。 基になる GPU テクスチャに対して、または基になる GPU テクスチャから直接ビット値を転送するだけです。 これにより、Win2D が内部で使用しているアルファ形式を確認できます。

  • レンダーターゲットに描画セッションを作成する
  • drawingSession.Clear(Colors.Tranparent) を呼び出す
  • Colors.Tranparent は R = 255、G = 255、B = 255、A = 0 として定義されます
  • Win2D は、この値を事前乗算形式に変換し、R = 0、G = 0、B = 0、A = 0 を生成します。
  • GetPixelColorsを使用して rendertarget の内容を読み戻す
  • 元の直線アルファ Colors.Tranparent 値のように RGB = 255 ではなく、RGB = 0 の事前乗算形式が含まれていることを確認します

アルファ形式間の変換

直線のアルファ カラー値を事前乗算形式に変換するには、その R、G、B の値に A を乗算します。前乗算を直線に変換するには、R、G、B を A で除算します。

色情報は、多くの場合、0 から 255 までのバイト値として表されます (たとえば、 Windows.UI.Color 構造体は 4 バイトで構成されます)。 この表現は 255 の係数でスケールアップされるため、バイト値 255 は実際には 1 を意味し、128 は半強度です。 このスケーリング 係数は、フォーマット変換時に考慮する必要があるため、 Windows.UI.Color をストレートからプリマルチプライドに変換します。

premultiplied.R = (byte)(straight.R * straight.A / 255);
premultiplied.G = (byte)(straight.G * straight.A / 255);
premultiplied.B = (byte)(straight.B * straight.A / 255);
premultiplied.A = straight.A;

間違ったアルファ形式を使用している画像データがある場合は、 PremultiplyEffect または UnPremultiplyEffect を使用して変換できます。