12.6 | Farben und Farbmodelle |
Für die Darstellung von Farben besitzt Java die Klasse Color. Jedes Exemplar dieser Klasse repräsentiert eine Farbe. Für oft gebrauchte Farben werden in dieser Klasse Konstanten definiert.
Tabelle 12.3: Farbkonstanten Color.black Color.blue Color.cyan Color.darkgray Color.gray Color.green Color.lightgray Color.magenta Color.orange Color.pink Color.red Color.white Color.yellow Um Farben zu erzeugen, die nicht durch diese Konstanten abgedeckt werden, muss ein Exemplar von Color erzeugt werden. Die Spezifizierung der Farben erfolgt nach dem RGB-Modell. Dies kann auf folgende Arten geschehen:
Ist ein Exemplar von Color erzeugt, kann es bestimmten Objekten zugewiesen werden, z. B. mit setColor(), setForeground(), setBackground() usw. Color besitzt die Methoden brighter() und darker(). Ruft man eine dieser Methoden eines Color-Objekts auf, wird als Ergebnis ein Color-Objekt geliefert, das eine hellere bzw. eine dunklere Farbe als das Original repräsentiert. Die Darstellung einer Farbe erfolgt intern als 4-Byte-int-Wert. Sie besteht aus je einem Byte Alpha-, Rot-, Grün- und Blauanteil. Der Alphawert enthält die Deckungskraft der Farbe.
- Color(int r, int g, int b)
Dem Konstruktor werden die Rot-, Grün- und Blauanteile übergeben. Die angegebenen Werte müssen alle im Bereich zwischen 0 und 255 liegen.- Color(float r, float g, float b)
Dem Konstruktor werden die Rot-, Grün- und Blauanteile als float-Wert übergeben. Der angegebene Wert muss jeweils zwischen 0 und 1 liegen.- Color(int rgb)
Dem Konstuktor werden die Rot-, Grün- und Blauanteile als kombinierte 4-Byte-int-Werte übergeben. Die Bits 0-7 entsprechen dem Blau-, die Bits 8-15 dem Grün- und die Bits 16-23 dem Rotanteil.Wird wie in den folgenden Abschnitten direkt mit solchen Farben gearbeitet, bietet sich die hexadezimale Schreibweise an. Die Farbe Color.black wird intern als
0xFF000000dargestellt. Die Farbe0xFF102030ist anders zusammengesetzt. Ihre Deckung ist maximal (0xFF), der Blauanteil beträgt 48 (0x30), der Grünanteil 32 (0x20), und der Rotanteil hat den Wert 16 (0x10). Die einzelnen Werte wurden aus dem int-Wert extrahiert und in das Dezimalsystem umgerechnet. Diese Darstellung bezieht sich allerdings nur auf das Standard-RGB-Modell, nicht auf eigene Farbmodelle (siehe unten). Das Standard-RGB-Modell wird von allen Interfaces des Pakets java.awt.image verwendet (ImageProducer, ImageConsumer und ImageObserver). Die Klasse Color definiert des weiteren statische Methoden, die zur Konvertierung von Farben in das HSB-Modell eingesetzt werden können. Im HSB-Modell wird eine Farbe durch die Werte von Grundton, Farbsättigung und Helligkeit spezifiziert. Diese drei Attribute werden durch einen float-Wert zwischen 0 und 1 angegeben. Um ein Color-Objekt mit Werten im HSB-Modell zu erzeugen, muss man die Methodepublic static Color getHSBColor(float h, float s, float b)verwenden. getHSBColor() ist eine statische Methode, die in der Klasse Color definiert ist. Sie liefert als Ergebnis ein Color-Objekt, das nach den übergebenen Werten im HSB-Modell komponiert wird. Zur Konvertierung von Farbwerten vom HSB-Modell in das RGB-Modell und umgekehrt stehen dem Benutzer die Methoden HSBtoRGB(float, float, float) bzw. RGBtoHSB(int, int, int, float[]) zur Verfügung.
Ein Exemplar des RGB-Modells erhält man durch Aufruf der Methode ColorModel.getRGBdefault(). Diese Methode kann ohne ein vorhandenes Exemplar aufgerufen werden, da sie static ist.
Die Klasse ColorModel repräsentiert in Java ein Farbmodell. ColorModel besitzt neben der Methode getRGBdefault() weitere Methoden, welche die einzelnen Farbanteile eines Farbwertes liefern: Von ColorModel können keine Exemplare erzeugt werden, da die Klasse abstrakt ist. Will man ein eigenes Farbmodell anlegen, muss man ColorModel überschreiben. Die Verteilung der einzelnen Farbanteile auf einen Farbwert kann somit beliebig festgelegt werden.
Dem Konstruktor von ColorModel wird die Anzahl der Bits übergeben, die für die Darstellung einer Farbe benötigt werden. Die obigen Methoden müssen so implementiert werden, dass sie die dem Farbmodell entsprechenden Farbanteile liefern. Die Verwendung eines eigenen Farbmodells in Verbindung mit der Klasse MemoryImageSource wird im nächsten Abschnitt erklärt. Zwei von ColorModel abgeleitete Klassen existieren bereits seit JDK 1.0:Mit
- DirectColorModel
Definiert eigentlich kein eigenes Farbmodell, sondern erweitert nur die Zugriffsmöglichkeiten auf die einzelnen Farbanteile eines schon vorhandenen Modells.Statt ausschließlich auf den Betrag der einzelnen Farbwerte zuzugreifen, kann man bei DirectColorModel zusätzlich die Masken abfragen. Hierbei werden alle nicht gewünschten Anteile des Farbwertes ausgeblendet. Somit wird die Position des Farbanteils innerhalb des Farbwertes verwendet. Wenn z. B. die Bits 0 bis 7 den Rotanteil einer Farbe angeben, besteht die Maske des Rotanteils aus einem int-Wert, bei dem nur die Bits 0 bis 7 gesetzt sind. Alle anderen Bits sind 0.
- IndexColorModel
Stellt eine indizierte Farbtabelle dar. Dem Konstruktor von IndexColorModel werden Arrays mit den einzelnen Farbanteilen übergeben. Die Arrays besitzen alle dieselbe Länge. Die Elemente mit demselben Array-Index bilden zusammen jeweils eine Farbe. Alle Arrays zusammen bilden die Farbtabelle des IndexColorModels. Um z. B. den Blauanteil einer Farbe abzufragen, wird getBlue() nicht das Pixel übergeben, in dem die Farbanteile gespeichert sind, sondern ein Index aus der Farbtabelle, die von IndexColorModel verwaltet wird.dem JDK 1.2 wurden zusätzlich die Klassen PackedColorModel und ComponentColorModel eingeführt, die in Verbindung mit dem neuen Grafikmodell genutzt werden. Da dieses Buch den Aufbau des neuen Grafikmodells aus Platzgründen nicht behandelt, wird an dieser Stelle jedoch auf eine detaillierte Beschreibung verzichtet und auf die Referenz verwiesen.