Wie kann man eine Komplementärfarbe ermitteln?

Komplementärfarben sind Ergänzungsfarben, die sich aus der Differenz einer Farbe zu Weiß ergeben.

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.

Komplementärfarbe

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.