ColorMath class

Functions for blending of multiple colours, conversion between HSL and RGB colour space, greyscale conversion and more helper functions for handling of colours.

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.

Compatibility: .NET Version 2.0 or newer

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.
2010Mar26
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.

Licence and terms of use

Copying and distribution of this file, with or without modification, are permitted provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. (GNU All-Permissive licence)

Statistic data

  • Created on 2007-08-30, updated on 2012-01-13.