Vorlesung Informatik 2 - Teil A: Java Kurs
8.2 Alpha Kanal und Farbmodell
Alphakanal:
-
Zu jedem Pixel wird ein Faktor gespeichert, der steuert, wie dieses Pixel mit seinem Hintergrund gemischt wird (blending) . Porter und Duff nennen diesen Mischungsfaktor Alphakanal. Sein Wert liegt zwischen 0 und 1.Bei 0 ist der Vordergrund vollkommen transparent, bei 1 undurchsichtig (opak).
-
Das Format [r,g,b,α] wird direkter Alphakanal, engl. straight alpha genannt. Die Farbkanäle r,g,b enthalten die original Farbwerte des Pixels und werden bei vor jeder Verwendung mit dem Alphakanal multipliziert. In der Java Klasse BufferedImage gibt es die Konstanten TYPE_INT_ARGB sowie TYPE_4BYTE_AGBR für Bilder mit diesem Farbmodell. Ein Quadrupel, bei dem ein Farbkanal einen Wert größer als α hat, ist unzulässig.
Nachteil: Performance-Probleme bei älteren Grafikkarten wegen der ständigen Multiplikation mit Alpha -bei α=0 werden alle Farben zu 0. -
Um den Performance-Nachteil auszugleichen, speichert man im Pixel [rα, gα, bα, α], dieses Format nennt man integriertes Alpha oder premultiplied alpha . Die ursprüngliche Farbe eines Pixels ist hier also (r/,α, g/α, b/α). In BufferedImage bezeichnen TYPE_INT_ARGB_PRE sowie TYPE_4BYTE_AGBR_PRE Bilder mit diesem Farbmodell.
Das Quadrupel [r,g,b,α] bezeichnet also ein Pixel mit den Farben (r/,α, g/α, b/α), das seinen Hintergrund mit dem Faktor α überlagert.
Nachteil Genauigkeitsverlust, wenn α gegen 0 geht.
Ein halbtransparentes rotes Pixel mit direktem Alpha hat die Werte [255,0,0,0.5], bei integriertem Alpha wirds [128,0,0,0.5] gespeichert.
In seiner einfachsten Form hat der Alphakanal eine Auflösung von 1Bit (binärer Alphakanal) , wie z.B. im Gif-Dateiformat.
[0,0,0,1] und [0,0,0,0] bezeichnen ein schwarzes bzw. durchsichtiges Pixel, diese beiden Quadrupel werden für Maskenoperationen verwendet.
Die Klasse BufferedImage:
- getColorModel(): ColorModel
- TYPE_INT_RGB, TYPE_INT_ARGB, TYPE_INT_ARGB_PRE, TYPE_BYTE_GRAY
Die Klasse ColorModel bildet ein Farbmodell ab:
- hasAlpha(): boolean
- isAlphaPreMultiplied(): boolean
- getColorSpace(): ColorSpace
und ein Objekt vom Typ ColorSpace eine Farbraum:
- getNumComponents(); int
- getMinValue(component: int): float
- getMaxValue(component: int): float
- TYPE_Lab, TYPE_HSV, TYPE_RGB, Type_XYZ, Type_YCbCr, ...
Ein Bild in ein neues Farbmodell mit Alpha-Kanal konvertieren:
bild=ImageIO.read(datei);Lehrvideo (YouTube)
BufferedImage neu = new BufferedImage(bild.getWidth(), bild.getHeight(),BufferedImage.TYPE_INT_ARGB);
ColorConvertOp op = new ColorConvertOp(null);
op.filter(bild,neu);