Opierając się na mojej odpowiedzi na podobne pytanie .
Musisz podzielić kod szesnastkowy na 3 części, aby uzyskać indywidualne intensywności czerwony, zielony i niebieski. Każda 2 cyfra kodu reprezentuje wartość w zapisie szesnastkowym (podstawa 16). Nie będę tutaj wchodził w szczegóły konwersji, można je łatwo sprawdzić.
Po uzyskaniu intensywności dla poszczególnych kolorów możesz określić ogólną intensywność koloru i wybrać odpowiedni tekst.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
Próg 186 jest oparty na teorii, ale można go dostosować do smaku. W oparciu o komentarze poniżej próg 150 może działać lepiej dla Ciebie.
Edycja: Powyższe jest proste i działa dość dobrze i wydaje się mieć dobrą akceptację tutaj w StackOverflow. Jednak jeden z poniższych komentarzy pokazuje, że w niektórych okolicznościach może prowadzić do niezgodności z wytycznymi W3C. Otrzymuję zmodyfikowaną formę, która zawsze wybiera najwyższy kontrast w oparciu o wytyczne. Jeśli
nie musisz przestrzegać reguł W3C, trzymałbym się prostszej formuły powyżej.
Wzór podany dla kontrastu w Zaleceniach W3C jest taki (L1 + 0.05) / (L2 + 0.05)
, w którym L1
luminancja jest najjaśniejszym kolorem i L2
jest luminancją najciemniejszego w skali od 0,0 do 1,0. Luminancja czerni wynosi 0,0, a biel 1,0, więc zastąpienie tych wartości pozwala określić tę o najwyższym kontraście. Jeśli kontrast czerni jest większy niż kontrast bieli, użyj czerni, w przeciwnym razie użyj bieli. Biorąc pod uwagę luminancję koloru, który testujesz, gdy L
test staje się:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Upraszcza to algebraicznie do:
if L > sqrt(1.05 * 0.05) - 0.05
Lub w przybliżeniu:
if L > 0.179 use #000000 else use #ffffff
Pozostało tylko obliczyć L
. Ta formuła jest również podana w wytycznych i wygląda na to, że konwersja z sRGB na liniowy RGB następuje zgodnie z zaleceniem ITU-R BT.709 dla luminancji.
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
Próg 0,179 nie powinien zostać zmieniony, ponieważ jest powiązany z wytycznymi W3C. Jeśli wyniki Ci się nie podobają, wypróbuj powyższą prostszą formułę.