Aufbauend auf meiner Antwort auf eine ähnliche Frage .
Sie müssen den Hex-Code in drei Teile teilen, um die einzelnen Intensitäten für Rot, Grün und Blau zu erhalten. Jeweils 2 Ziffern des Codes stehen für einen Wert in hexadezimaler (Basis-16) Notation. Ich werde hier nicht auf die Details der Konvertierung eingehen, sie sind leicht nachzuschlagen.
Sobald Sie die Intensitäten für die einzelnen Farben festgelegt haben, können Sie die Gesamtintensität der Farbe bestimmen und den entsprechenden Text auswählen.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
Die Schwelle von 186 basiert auf der Theorie, kann aber nach Geschmack angepasst werden. Basierend auf den Kommentaren unten kann ein Schwellenwert von 150 für Sie besser funktionieren.
Bearbeiten: Das Obige ist einfach und funktioniert ziemlich gut und scheint hier bei StackOverflow eine gute Akzeptanz zu haben. Einer der folgenden Kommentare zeigt jedoch, dass es unter bestimmten Umständen zu einer Nichteinhaltung der W3C-Richtlinien kommen kann. Hiermit leite ich eine modifizierte Form ab, die immer den höchsten Kontrast basierend auf den Richtlinien wählt. Wenn Sie
sich nicht an die W3C-Regeln
halten müssen, würde ich mich an die einfachere Formel oben halten.
Die in den W3C-Empfehlungen angegebene Formel für den Kontrast lautet (L1 + 0.05) / (L2 + 0.05)
: Dabei L1
ist die Luminanz der hellsten Farbe und L2
die Luminanz der dunkelsten Farbe auf einer Skala von 0,0 bis 1,0 angegeben. Die Luminanz von Schwarz beträgt 0,0 und Weiß von 1,0. Wenn Sie diese Werte ersetzen, können Sie den Wert mit dem höchsten Kontrast bestimmen. Wenn der Kontrast für Schwarz größer ist als der Kontrast für Weiß, verwenden Sie Schwarz, andernfalls Weiß. Angesichts der Luminanz der Farbe, die Sie L
testen, wird der Test wie folgt:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Dies vereinfacht sich algebraisch auf:
if L > sqrt(1.05 * 0.05) - 0.05
Oder ungefähr:
if L > 0.179 use #000000 else use #ffffff
Das einzige, was noch übrig ist, ist zu berechnen L
. Diese Formel ist auch in den Richtlinien angegeben und sieht aus wie die Umstellung von sRGB auf lineares RGB, gefolgt von der ITU-R-Empfehlung BT.709 für die Luminanz.
for each c in r,g,b:
c = c / 255.0
if c <= 0.03928 then c = c/12.92 else c = ((c+0.055)/1.055) ^ 2.4
L = 0.2126 * r + 0.7152 * g + 0.0722 * b
Der Schwellenwert von 0,179 sollte nicht geändert werden, da er an die W3C-Richtlinien gebunden ist. Wenn Sie feststellen, dass die Ergebnisse nicht Ihren Wünschen entsprechen, versuchen Sie es mit der einfacheren Formel oben.