ColorMath-Klasse

Funktionen zum Überblenden mehrerer Farben, zur Konvertierung zwischen HSL- und RGB-Farbraum, Graustufen-Konvertierung und weitere Hilfsfunktionen zum Umgang mit Farben.

Das Problem

Eine gute Praxis für GUI-Anwendungen ist es, das vom Benutzer ausgewählte Farbschema zu beachten, anstatt generell alle Listen weiß und alle Schaltflächen grau darzustellen. Das sorgt für vertraute Farben auf dem Bildschirm und ist ein Baustein für Software, die sich gut in das Betriebssystem integriert. Das führt zu einer höheren wahrgenommenen Qualität des Programms und letztlich zu mehr Anwenderakzeptanz.

Für Windows-Forms-Anwendungen stellt das .NET-Framework die System­Colors-Klasse bereit, mit deren Eigenschaften die Farbwerte der einzelnen GUI-Bestandteile abgerufen werden können. Oft möchte man aber eine dieser Farben verändern, sie heller oder dunkler gestalten, oder zwei Farben miteinander mischen. Bei der Verwendung konstanter Farben kann man das zur Entwurfszeit mit jedem Bildbearbeitungsprogramm oder meinem Farbeimer austüfteln. Wenn dynamische Farben verwendet werden, ist das aber nicht möglich, sondern die Mischberechnung muss dann zur Laufzeit erfolgen. Das ist mathematisch kein Problem, aber im Code auf die Dauer doch recht unübersichtlich.

Die Lösung

Die ColorMath-Klasse vereinfacht den Umgang mit Farben. Mehrere Farben können mit einem Funktionsaufruf in einem beliebigen Verhältnis gemischt, aufgehellt oder abgedunkelt werden. Das ermöglicht bereits die Herstellung der meisten Farbtöne und -schattierungen, die für eine intuitive Benutzeroberfläche benötigt werden. Je nach Helligkeit (Grauwert für das menschliche Auge) einer Hintergrundfarbe kann automatisch die passende Schriftfarbe (z. B. schwarz oder weiß) gewählt werden, um die beste Lesbarkeit sicherzustellen.

Mit der Konvertierung zwischen dem RGB- und dem HSL-Farbraum lassen sich die Farben zudem viel intuitiver zusammenstellen. So können die Komponenten Farbton, Sättigung und Helligkeit unabhängig voneinander eingestellt werden. Einen leichten Einstieg in die Zusammenhänge der Farbräume bietet die Anwendung Farbeimer, die ebenfalls diese Klasse verwendet.

Kompatibilität: .NET Ab Version 2.0

Beispiel

Die folgenden Beispielcode-Schnipsel zeigen, wie die ColorMath-Klasse verwendet werden kann:

// Hintergrundfarbe eines ausgewählten Listeneintrags durchscheinen lassen
var selectionColor = ColorMath.Blend(SystemColors.Highlight, listItem.BackColor, 0.5);

// ToolStrip-Hintergrund bei Windows-XP-typischem Grau etwas aufhellen
Color backColor;
if (ColorMath.RgbToHsl(SystemColors.Control).L > 215)
{
    // Could be Aero (L=240) or Luna (L=225-226),
    // the Control colour is (almost) light enough to use it directly
    // (A little lighting up makes it better)
    backColor = ColorMath.Blend(SystemColors.Control, SystemColors.Window, 0.2);
}
else
{
    // Could be Classic (L=206), the Control colour is too dark and must be lit up
    // (keeping its hue)
    backColor = ColorMath.Blend(SystemColors.Control, SystemColors.Window, 0.6);
}
toolStrip1.BackColor = backColor;

// Benutzer hat den Farbton und eine relative Helligkeit (1 bis 5) ausgewählt,
// Farbwert zur Anzeige berechnen
var hsl = new HslColor(hue, 200, 128 + (light - 3) * 32);
var userColor = ColorMath.HslToRgb(hsl);

Download

ColorMath.cs4,4 KiBQuelltext der ColorMath-Klasse

Änderungen

2012Jan13
Neue Funktionen: Darken und Lighten
2011Jul29
MixedColor in Blend umbenannt.
2010Mrz26
Neue RGB-zu-HSL-Konvertierung (portiert von der JavaScript-Implementierung in coati);
GetLightness in ToGray umbenannt.
2010Feb1
Neue Funktionen: GetLightness und IsDarkColor
2007Aug30
Erste Version, nur mit der MixedColor-Funktion.

Lizenz und Nutzungsbedingungen

Vervielfältigung und Weiterverbreitung dieser Datei, verändert oder unverändert, sind gestattet, vorausgesetzt die Urheberrechtsangabe und dieser Hinweis bleiben erhalten. Diese Datei wird wie vorliegend ohne jegliche Garantie oder Gewährleistung angeboten. (GNU All-Permissive-Lizenz)

Statistische Daten

  • Erstellt am 2007-08-30, aktualisiert am 2012-01-13.