Ich bin auf ein ähnliches Problem gestoßen. Ich musste eine gute Methode zur Auswahl kontrastiver Schriftfarben finden, um Textbeschriftungen auf Farbskalen / Heatmaps anzuzeigen. Es musste eine universelle Methode sein und die erzeugte Farbe musste "gut aussehend" sein, was bedeutet, dass das einfache Erzeugen von Komplementärfarben keine gute Lösung war - manchmal erzeugte es seltsame, sehr intensive Farben, die schwer zu sehen und zu lesen waren.
Nach stundenlangen Tests und Versuchen, dieses Problem zu lösen, stellte ich fest, dass die beste Lösung darin besteht, weiße Schrift für "dunkle" Farben und schwarze Schrift für "helle" Farben auszuwählen.
Hier ist ein Beispiel für eine Funktion, die ich in C # verwende:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double luminance = ( 0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (luminance > 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
Dies wurde für viele verschiedene Farbskalen (Regenbogen, Graustufen, Hitze, Eis und viele andere) getestet und ist die einzige "universelle" Methode, die ich herausgefunden habe.
Bearbeiten
Die Zählformel wurde a
in "Wahrnehmungsluminanz" geändert - es sieht wirklich besser aus! Bereits in meiner Software implementiert, sieht gut aus.
Bearbeiten 2
@WebSeed lieferte ein hervorragendes Beispiel für diesen Algorithmus: http://codepen.io/WebSeed/full/pvgqEq/
Nur für den Fall, dass jemand eine kürzere, vielleicht leichter verständliche Version der Antwort von GaceK haben möchte :
Hinweis: Ich habe die Inversion der Luma entfernt Werts entfernt (damit helle Farben einen höheren Wert haben, was mir natürlicher erscheint und auch die 'Standard'-Berechnungsmethode ist.
Ich habe von hier aus die gleichen Konstanten wie GaceK verwendet , da sie für mich hervorragend funktionierten.
(Sie können dies auch als Erweiterungsmethode mit der folgenden Signatur implementieren :
Sie können es dann über anrufen
foregroundColor = background.ContrastColor()
.)quelle
Vielen Dank, dass Sie @Gacek . Hier ist eine Version für Android:
Und eine verbesserte (kürzere) Version:
quelle
1 - ...
Teil und benennen Sie esa
inluminance
Meine schnelle Umsetzung von Gaceks Antwort:
quelle
Javascript [ES2015]
quelle
Danke für diesen Beitrag.
Für alle, die interessiert sein könnten, hier ein Beispiel für diese Funktion in Delphi:
quelle
Dies ist eine so hilfreiche Antwort. Danke dafür!
Ich möchte eine SCSS-Version teilen:
Finden Sie nun heraus, wie Sie mit dem Algorithmus automatisch Schwebefarben für Menüverknüpfungen erstellen. Helle Header erhalten einen dunkleren Schwebeflug und umgekehrt.
quelle
Flattern Implementierung
quelle
Hässliches Python, wenn Sie keine Lust haben, es zu schreiben :)
quelle
Ich hatte das gleiche Problem, aber ich musste es in PHP entwickeln . Ich habe die Lösung von @ Garek verwendet und auch diese Antwort: Konvertieren Sie Hex-Farben in RGB-Werte in PHP , um HEX-Farbcode in RGB zu konvertieren.
Also teile ich es.
Ich wollte diese Funktion mit der angegebenen HEX-Hintergrundfarbe verwenden, aber nicht immer ab '#'.
quelle
Als Kotlin / Android-Erweiterung:
quelle
Eine Implementierung für Ziel-c
quelle
iOS Swift 3.0 (UIColor-Erweiterung):
quelle
Swift 4 Beispiel:
UPDATE - Es
0.6
wurde festgestellt, dass dies ein besserer Prüfstand für die Abfrage warquelle
CGColor.components
variiert je nach Farbraum:UIColor.white
Wenn sie beispielsweise in eine CGColor umgewandelt werden, gibt es nur zwei: Sie[1.0, 1.0]
stellen eine Graustufenfarbe (bei vollständig Weiß) mit einem vollständigen Alpha dar. Ein besseres Mittel zum Extrahieren der RGB-Elemente einer UIColor istUIColor.getRed(_ red:, green:, blue:, alpha:)
Beachten Sie, dass es in der Google Closure Library einen Algorithmus dafür gibt , der auf eine w3c-Empfehlung verweist: http://www.w3.org/TR/AERT#color-contrast . In dieser API stellen Sie jedoch eine Liste der vorgeschlagenen Farben als Ausgangspunkt bereit.
quelle
Wenn Sie Farbräume für visuelle Effekte bearbeiten, ist es im Allgemeinen einfacher, in HSL (Farbton, Sättigung und Helligkeit) als in RGB zu arbeiten. Das Verschieben von Farben in RGB, um natürlich ansprechende Effekte zu erzielen, ist konzeptionell recht schwierig, während das Konvertieren in HSL, das Manipulieren dort und das erneute Konvertieren im Konzept intuitiver ist und ausnahmslos besser aussehende Ergebnisse liefert.
Wikipedia hat eine gute Einführung in HSL und den eng verwandten HSV. Und es gibt kostenlosen Code im Internet, um die Konvertierung durchzuführen ( hier ist zum Beispiel eine Javascript-Implementierung ).
Welche genaue Transformation Sie verwenden, ist Geschmackssache, aber ich persönlich hätte gedacht, dass das Umkehren der Komponenten Farbton und Helligkeit in erster Näherung eine gute kontrastreiche Farbe erzeugen würde, aber Sie können leicht subtilere Effekte erzielen.
quelle
Sie können jeden Farbtontext auf jedem Farbtonhintergrund haben und sicherstellen, dass er lesbar ist. Das mache ich die ganze Zeit. Es gibt eine Formel dafür in Javascript für lesbaren Text in Farbe - STW * Wie auf diesem Link steht, ist die Formel eine Variation der Berechnung der inversen Gamma-Anpassung, obwohl sie meiner Meinung nach etwas besser zu handhaben ist. Die Menüs auf der rechten Seite dieses Links und die zugehörigen Seiten verwenden zufällig generierte Farben für Text und Hintergrund, die immer lesbar sind. Also ja, klar, es kann gemacht werden, kein Problem.
quelle
Eine Android-Variante, die auch das Alpha erfasst.
(danke @ thomas-vos)
quelle
base
R-Version von @ Gaceks Antwort zu erhaltenluminance
(Sie können Ihren eigenen Schwellenwert leicht anwenden)Verwendung:
quelle
Basierend auf Gaceks Antwort und nachdem ich das Beispiel von @ WebSeed mit der WAVE- Browsererweiterung analysiert habe, habe ich die folgende Version entwickelt, die schwarzen oder weißen Text basierend auf dem Kontrastverhältnis auswählt (wie in den W3C- Richtlinien für die Barrierefreiheit von Webinhalten (WCAG) 2.1 definiert ) ). anstelle der Leuchtdichte.
Dies ist der Code (in Javascript):
Ein funktionierendes Beispiel finden Sie in meiner Abzweigung des Codepens von @ WebSeed, der in WAVE keine kontrastarmen Fehler erzeugt.
quelle