Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Beim Verwenden von Straight-Alpha, auch als lineares Alpha bezeichnet:
- RGB-Werte geben die Farbe des Zeichnungselements an.
- Der Alphawert gibt an, wie deckend es 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 ein Straight-Alphaformat verwenden:
result = (source.RGB * source.A) + (dest.RGB * (1 - source.A))
Vormultipliziertes Alpha
Bei Verwendung von prämultipliziertem 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überblendung zwischen zwei Farben aus, die ein prämultipliziertes Alphaformat verwenden:
result = source.RGB + (dest.RGB * (1 - source.A))
Prämultipliziertes Alpha wird beim Rendern von Grafiken verwendet, da es beim Filtern von Bildern oder beim Zusammensetzen verschiedener Ebenen bessere Ergebnisse liefert als nicht prämultipliziertes Alpha. Weitere Informationen finden Sie in den folgenden Blogbeiträgen:
Alpha in Win2D
Win2D verwendet gerades Alpha in der API-Oberfläche, aber prämultipliziertes Alpha für interne Renderingvorgänge.
Windows.UI.Color-Werte verwenden Straight-Alpha. Immer wenn Sie eine Farbe an eine Draw*- oder Fill*-Methode übergeben, die Farbe eines Pinsels setzen oder auf einen Farbwert zurücksetzen, wird diese Farbe mit geradem Alpha angegeben.
Die in einer Bitmap oder einem Renderziel gespeicherten Pixelwerte sowie die Zeichen- oder Blendvorgä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 gerade zu prämultipliziert konvertiert, 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. Es wird immer davon ausgegangen, dass Effekteingabedaten prämultipliziert sind. Wenn ein Effekt also mit nicht prämultipliziertem Alpha arbeiten muss, wird zunächst eine Transformation zur Aufhebung der Prämultiplikation angewendet, der Effekt berechnet und die Ausgabe anschließend wieder prämultipliziert.
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 Sie eine Zeichensitzung auf einem Rendertarget
- Rufen Sie
drawingSession.Clear(Colors.Transparent)an. -
Colors.Transparentist 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
- Verwenden Sie
GetPixelColors, um den Inhalt des Render-Targets auszulesen. - Beachten Sie, dass es prämultipliziertes Format RGB = 0, nicht RGB = 255 enthält, wie der ursprüngliche gerade Alphawert
Colors.Transparent
Konvertieren zwischen Alphaformaten
Um einen Alpha-Farbwert im geraden Alphaformat in ein prämultipliziertes Format umzuwandeln, multiplizieren Sie seine R-, G- und B-Werte mit A. Um ein prämultipliziertes Format in gerades Alpha umzuwandeln, teilen Sie 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 im falschen Alpha-Format vorliegen, können PremultiplyEffect oder UnPremultiplyEffect verwendet werden, um sie zu konvertieren.
Windows developer