Freigeben über


Prämultiplizierte Alphas

In Computergrafiken gibt es zwei verschiedene Möglichkeiten, die Deckkraft eines Farbwerts darzustellen. Win2D verwendet beide Methoden. In diesem Artikel wird der Unterschied erläutert und wo sie verwendet wird.

Gerades Alpha

Bei verwendung von geradem, auch als lineares Alpha bezeichnet:

  • RGB-Werte geben die Farbe des Zeichnungselements an.
  • Der Alphawert gibt an, wie einfarbig er ist.

In dieser Welt sind RGB und Alpha unabhängig. Sie können eins ändern, ohne dass sich dies auf die andere auswirkt. Um ein Objekt auszublenden, würden Sie den Alphawert schrittweise reduzieren, während RGB unverändert bleibt.

So führen Sie eine Quellüberblendung zwischen zwei Farben aus, die gerades Alphaformat verwenden:

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

Prämultiplizierte Alphas

Bei Verwendung von prämultiplizierten Alpha:

  • RGB gibt an, wie viel Farbe das gezeichnete Element zur Ausgabe beiträgt.
  • Der Alphawert gibt an, wie viel es verdeckt, was dahinter liegt.

In dieser Welt sind RGB und Alpha verknüpft. Um ein Objekt transparent zu machen, müssen Sie sowohl seine RGB-Farbe reduzieren (um weniger Farbe beizutragen) als auch dessen Alpha (um weniger von dem zu verdecken, was dahinter liegt). Vollständig transparente Objekte haben überhaupt keine Farbe mehr, daher gibt es nur einen Wert, der 100 % Transparenz darstellt: RGB und Alpha alle Null.

So führen Sie eine Quellübereinmischung zwischen zwei Farben aus, die prämultipliziertes Alphaformat verwenden:

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

Prämultipliziertes Alpha wird beim Rendern von Grafiken verwendet, da es bessere Ergebnisse als gerades Alpha liefert, wenn Bilder gefiltert oder verschiedene Ebenen verfasst werden. Weitere Informationen finden Sie in den folgenden Blogbeiträgen:

Alpha in Win2D

Win2D verwendet gerade Alpha in der API-Oberfläche, aber prämultipliziertes Alpha für interne Renderingvorgänge.

Windows.UI.Color Werte verwenden gerade Alpha. Wenn Sie eine Farbe an eine Draw* oder Fill* eine Methode übergeben, die Farbe eines Pinsels festlegen oder auf einen Farbwert löschen, wird diese Farbe mit geradem Alpha angegeben.

Die in einer Bitmap oder rendertarget gespeicherten Pixelwerte sowie die Zeichnungs- oder Vermischungsvorgänge, die auf diesen Oberflächen ausgeführt werden, verwenden prämultipliziertes Alpha. Wenn Bitmaps aus einer Datei geladen werden, werden ihre Inhalte automatisch in prämultipliziertes Format konvertiert. Wenn Sie eine Win2D-Zeichnungsmethode aufrufen, wird der Farbparameter von direkt in prämultipliziert, bevor die eigentliche Zeichnung stattfindet.

Win2D-Bildeffekte verwenden eine Mischung aus geradem und prämultipliziertem Alpha. Einige Effekte funktionieren auf einem Format, einige auf der anderen Seite, und einige stellen eine Eigenschaft bereit, die Sie auswählen können. In der Dokumentation für jeden Effekttyp wird beschrieben, welcher Alphamodus verwendet wird. Effekteingabedaten werden immer als prämultipliziert angenommen. Wenn ein Effekt also mit geradem Alpha arbeiten muss, wird zuerst eine unvoreingestellte Transformation angewendet, der Effekt berechnet und dann die Ausgabe erneut prämultiply angewendet.

Die Bitmap-APIs GetPixelBytes, SetPixelBytes, GetPixelColorsund SetPixelColors, führen keine Alphaformatkonvertierungen durch. Sie übertragen einfach direkt Bitwerte in oder aus der zugrunde liegenden GPU-Textur. Auf diese Weise können Sie beobachten, welches Alphaformat Win2D intern verwendet:

  • Erstellen einer Zeichnungssitzung auf einem Rendertarget
  • Rufen Sie drawingSession.Clear(Colors.Tranparent) auf.
  • Colors.Tranparent ist als R = 255, G = 255, B = 255, A = 0
  • Win2D wandelt diesen Wert in prämultipliziertes Format um, wobei R = 0, G = 0, B = 0, A = 0
  • Dient GetPixelColors zum Lesen des Inhalts des Rendertargets
  • Beachten Sie, dass es prämultipliziertes Format RGB = 0, nicht RGB = 255 enthält, wie der ursprüngliche gerade Alphawert Colors.Tranparent

Konvertieren zwischen Alphaformaten

Wenn Sie einen geraden Alphafarbwert in prämultipliziertes Format konvertieren möchten, multiplizieren Sie die Werte R, G und B mit A. So konvertieren Sie prämultipliziert in gerade, dividieren R, G und B durch A.

Beachten Sie, dass Farbinformationen häufig als Bytewerte zwischen 0 und 255 dargestellt werden (z. B. besteht die Windows.UI.Color Struktur aus 4 Bytes). Diese Darstellung wird um den Faktor 255 skaliert, sodass ein Bytewert von 255 tatsächlich 1 bedeutet, während 128 eine halbe Intensität aufweist. Dieser Skalierungsfaktor muss während der Formatkonvertierung berücksichtigt werden, damit ein Windows.UI.Color von geradem in prämultipliziertes Format konvertiert werden kann:

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;

Wenn Sie Bilddaten haben, die das falsche Alphaformat verwenden oder PremultiplyEffect UnPremultiplyEffect zum Konvertieren verwendet werden können.