Vorlesung Informatik 2 - Teil A: Java Kurs

8.2 Alpha Kanal und Farbmodell

Literatur: "Composing Digital Images", Thomas Porter, Tom Duff, Computer Graphics, Vol. 18, No. 3, 1984 (SIGGRAPH 1984)

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);			
BufferedImage neu = new BufferedImage(bild.getWidth(), bild.getHeight(),BufferedImage.TYPE_INT_ARGB);
ColorConvertOp op = new ColorConvertOp(null);
op.filter(bild,neu);
Lehrvideo (YouTube)