Wie kann man eine Komplementärfarbe ermitteln?
Additive Farbmischung
Das im Bereich der elektronischen Datenverarbeitung verbreitetste Farbsystem ist das sog. RGB-System. Sein Name ergibt sich aus den Teilfarben Rot, Grün und Blau, die miteinander gemischt einen neutralen Grauton oder in geeigneter, systemabhängiger Menge Weiß ergeben. Das System wird auch als physiologische Farbmischung bezeichnet, da die menschliche Farbwahrnehmung ebenfalls auf diesem Prinzip beruht, wie Mitte des 19. Jhdt. der Physiologe Hermann von Helmholtz entdeckte.
Nach der Drei-Farben-Theorie lassen sich gleiche
Anteile der Primärfarben Rot, Grün und Blau zu
Weiß addieren. Umgekehrt ergibt sich ein farbiger Eindruck
durch Mischung (Addition!) verschiedener Anteile dieser
drei Primärfarben. Mischt man jeweils zwei der drei
Primärfarben zu gleichen Teilen ohne Verwendung der
dritten, so vermischen sich Rot und Grün zu Gelb, Rot und
Blau ergeben Magenta und Blau und Grün mischen sich zu
Cyan. Würde man nun zu jeder dieser Mischfarben
(Sekundärfarben) die gleiche Menge der jeweils fehlenden
Primärfarbe hinzumischen, so ergäbe sich bei
geeigneten Anteilen Weiß.
Die fehlende Primärfarbe
ergänzt somit die jeweilige Sekundärfarbe zu
Weiß. Oder umgekehrt: Die Differenz einer beliebigen Farbe
zu Weiß ergibt deren Komplementärfarbe.
Primärfarbmischung | Mischungsergebnis | Komplementärfarbe |
---|---|---|
rot/grün | gelb | blau |
rot/blau | magenta | grün |
grün/blau | cyan | rot |
Das RGB-System in Java verwendet eine maximale
Farbsättigung von 8 bit pro Farbkanal. D.h. die
Intensitäten der drei Pimärfarben können durch
Werte zwischen dem Minimum 0 und dem Maximum 255 angegeben
werden. Die Farbangaben Rot=255, Grün=255 und Blau=255
errechnen sich somit zu reinem Weiß. Einem Color
-Objekt
können diese drei Werte übergeben werden.
Color c = new Color(255, 255, 255);
Nach dem oben Gesagten ergibt sich ein Gelb durch gleichanteilige Mischung von Rot und Grün unter Verzicht auf Blau.
Color yellow = new Color(255, 255, 0);
Zur Errechnung der zugehörigen Komplementärfarbe muss nun nur die Differenz aller drei Anteile zu 255 errechnet werden.
Color yellow = new Color(0, 0, 255);
Demoprogramm
Zur einfachen Demonstration der Anwendung von
Komplementärfarben ist unten ein Programm notiert, das
einen einfachen JFrame
mit zwei übereinander
platzierten JLabel
, sowie einen JButton
zum Farbwechsel zeigt. Die beiden Label zeigen zwei
Komplementärfarben im Hintergrund und deren jeweilige
Farbwerte in Textform.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
public class Komplementaerfarbe {
JLabel topLabel, bottomLabel;
public Komplementaerfarbe() {
initGUI();
}
private void initGUI() {
Font f = new Font("Helvetica", Font.PLAIN, 20);
topLabel = new JLabel();
topLabel.setFont(f);
topLabel.setOpaque(true);
topLabel.setHorizontalAlignment(SwingConstants.CENTER);
bottomLabel = new JLabel();
bottomLabel.setFont(f);
bottomLabel.setOpaque(true);
bottomLabel.setHorizontalAlignment(SwingConstants.CENTER);
paintLabels();
JPanel labelPanel = new JPanel(new GridLayout(2, 1));
labelPanel.add(topLabel);
labelPanel.add(bottomLabel);
JFrame frame = new JFrame("Komplement\u00e4rfarben");
frame.add(labelPanel, BorderLayout.CENTER);
JButton changeButton = new JButton("Farbe wechseln");
changeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
paintLabels();
}
});
frame.add(changeButton, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private Color createKompCol(Color c) {
int r = 255 - c.getRed();
int g = 255 - c.getGreen();
int b = 255 - c.getBlue();
return new Color(r, g, b);
}
private void paintLabels() {
Random rand = new Random();
int r = rand.nextInt(256);
int g = rand.nextInt(256);
int b = rand.nextInt(256);
Color c = new Color(r, g, b);
topLabel.setBackground(c);
topLabel.setText("Rot: " + c.getRed() + ", Gr\u00FCn: " + c.getGreen()
+ ", Blau: " + c.getBlue());
Color kc = createKompCol(c);
bottomLabel.setBackground(kc);
bottomLabel.setText("Rot: " + kc.getRed() + ", Gr\u00FCn: "
+ kc.getGreen() + ", Blau: " + kc.getBlue());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Komplementaerfarbe());
}
}
In initGUI()
werden zunächst die beiden JLabel
erzeugt und hinsichtlich Schrift, Opazität und
Schriftsausrichtung konfiguriert. Es folgt der Aufruf der
Methode paintLabels()
, gefolgt von der
Positionierung der beiden Label in einem Panel und dem
Hinzufügen eines JButton
. Er wird bei einem ActionListener
angemeldet, der bei Buttonaktivität wiederum für den
Aufruf von paintLabels()
sorgt.
In dieser Methodde werden zunächst drei Pseudo-Zufallswerte
erzeugt, die die RGB-Werte für ein Color
-Objekt
bilden. Die Methode nextInt()
der Klasse Random
liefert hierbei einen ganzzahligen, primitiven Integerwert
zwischen 0 und dem übergebenen Parameterwert exklusive. Das
mit den drei Werten für Rot, Grün und Blau erzeugte Color
-Objekt
wird einerseits als Hintergundfarbe des oberen Labels genutzt
und andererseits an die Methode createKompCol()
übergeben. Sie liefert ein weiteres Color
-Objekt
für die Komplementärfarbe, das zum Setzen der
Hintergrundfarbe des unteren Labels verwendet wird.
Es wird
so erzeugt, dass in createKompCol()
vom
übergebenen Color
-Objekt zuerst die
numerischen Anteile der Primärfarben ermittelt und diese
dann, wie oben erläutert, vom Maximalwert 255 subtrahiert
werden. Die so errechneten Werte dienen zur Bildung des Color
-Objektes
der Komplementärfarbe und werden zusätzlich auf dem
Label ausgegeben.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.