Napotkałem podobny problem. Musiałem znaleźć dobrą metodę wyboru kontrastowego koloru czcionki, aby wyświetlać etykiety tekstowe na skalach kolorów / mapach cieplnych. Musiała to być metoda uniwersalna, a generowany kolor musiał być „dobrze wyglądający”, co oznacza, że proste generowanie komplementarnego koloru nie było dobrym rozwiązaniem - czasami generowało dziwne, bardzo intensywne kolory, które były trudne do oglądania i czytania.
Po długich godzinach testowania i próbach rozwiązania tego problemu odkryłem, że najlepszym rozwiązaniem jest wybranie białej czcionki dla „ciemnych” kolorów i czarnej czcionki dla „jasnych” kolorów.
Oto przykład funkcji używam w C #:
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);
}
Zostało to przetestowane na wiele różnych skal kolorów (tęcza, skala szarości, ciepło, lód i wiele innych) i jest to jedyna „uniwersalna” metoda, jaką odkryłem.
Edytuj
Zmieniono formułę liczeniaa
na „spostrzegawczą luminancję” - naprawdę wygląda lepiej! Już zaimplementowane w moim oprogramowaniu, wygląda świetnie.
Edycja 2
@WebSeed stanowi świetny działający przykład tego algorytmu: http://codepen.io/WebSeed/full/pvgqEq/
Na wypadek, gdyby ktoś chciał krótszą, być może łatwiejszą do zrozumienia wersję odpowiedzi GaceK :
Uwaga: usunąłem inwersję lumy wartości (aby jasne kolory miały wyższą wartość, co wydaje mi się bardziej naturalne i jest również „domyślną” metodą obliczania).
Użyłem tych samych stałych co GaceK stąd, ponieważ działały dla mnie świetnie.
(Można to również zaimplementować jako metodę rozszerzenia przy użyciu następującego podpisu:
Możesz wtedy zadzwonić przez
foregroundColor = background.ContrastColor()
.)źródło
Dziękuję @Gacek . Oto wersja dla Androida:
I ulepszona (krótsza) wersja:
źródło
1 - ...
części i zmienić nazwęa
naluminance
Moja szybka implementacja odpowiedzi Gacka:
źródło
JavaScript [ES2015]
źródło
Dzięki za ten post.
Dla każdego, kto może być zainteresowany, oto przykład tej funkcji w Delphi:
źródło
To taka pomocna odpowiedź. Dzięki za to!
Chciałbym udostępnić wersję SCSS:
Teraz zastanawiam się, jak użyć algorytmu do automatycznego tworzenia kolorów aktywacji dla łączy menu. Jasne nagłówki mają ciemniejszy ruch i na odwrót.
źródło
Implementacja trzepotania
źródło
Brzydki Python, jeśli nie masz ochoty go pisać :)
źródło
Miałem ten sam problem, ale musiałem go rozwinąć w PHP . Użyłem rozwiązania @ Garek i użyłem również tej odpowiedzi: Konwertuj kolor szesnastkowy na wartości RGB w PHP, aby przekonwertować kod koloru HEX na RGB.
Więc dzielę się tym.
Chciałem użyć tej funkcji z danym kolorem HEX tła, ale nie zawsze zaczynając od „#”.
źródło
Jako rozszerzenie Kotlin / Android:
źródło
Implementacja dla celu-c
źródło
iOS Swift 3.0 (rozszerzenie UIColor):
źródło
Przykład Swift 4:
AKTUALIZACJA - Stwierdzono, że
0.6
to lepsze łóżko testowe dla zapytaniaźródło
CGColor.components
różni się w zależności od przestrzeni kolorów: na przykładUIColor.white
po rzutowaniu na CGColor ma tylko dwa:[1.0, 1.0]
reprezentuje kolor szarości (w pełni biały) z pełną alfą. Lepszym sposobem na wydobycie elementów RGB z UIColor jestUIColor.getRed(_ red:, green:, blue:, alpha:)
Zauważ, że istnieje algorytm do tego w bibliotece zamknięcia google, który odwołuje się do zalecenia w3c: http://www.w3.org/TR/AERT#color-contrast . Jednak w tym interfejsie API podajesz listę sugerowanych kolorów jako punkt wyjścia.
źródło
Jeśli manipulujesz przestrzenią kolorów w celu uzyskania efektu wizualnego, generalnie łatwiej jest pracować w HSL (Barwa, Nasycenie i Jasność) niż RGB. Przesuwanie kolorów w RGB w celu uzyskania naturalnie przyjemnych efektów jest zazwyczaj dość trudne koncepcyjnie, podczas gdy konwersja do HSL, manipulowanie tam, a następnie konwersja z powrotem jest bardziej intuicyjna i niezmiennie daje lepsze wyniki.
Wikipedia ma dobre wprowadzenie do HSL i blisko spokrewnionego HSV. W sieci jest darmowy kod do konwersji (na przykład tutaj jest implementacja javascript) )
Ta precyzyjna transformacja jest kwestią gustu, ale osobiście pomyślałbym, że odwrócenie komponentów Barwa i Lekkość z pewnością wygeneruje dobry kontrast o wysokim kontraście jako pierwszym przybliżeniu, ale łatwo można uzyskać bardziej subtelne efekty.
źródło
Możesz mieć dowolny tekst odcienia na dowolnym tle odcienia i upewnić się, że jest czytelny. Ciągle to robię. Istnieje formuła na to w JavaScript w czytelnym tekście w kolorze - STW * Jak napisano w tym linku, formuła jest odmianą obliczenia korekcji odwrotnej gamma, choć nieco łatwiejszą do zarządzania IMHO. Menu po prawej stronie tego linku i powiązanych z nim stron używają losowo generowanych kolorów tekstu i tła, zawsze czytelnych. Więc tak, oczywiście można to zrobić, nie ma problemu.
źródło
Odmiana Androida, która przechwytuje również alfa.
(dzięki @ thomas-vos)
źródło
base
Wersja R odpowiedzi @ Gacek, aby uzyskaćluminance
(możesz łatwo zastosować własny próg)Stosowanie:
źródło
W oparciu o odpowiedź Gacka i po przeanalizowaniu przykładu @ WebSeed z rozszerzeniem przeglądarki WAVE , opracowałem następującą wersję, która wybiera czarny lub biały tekst na podstawie współczynnika kontrastu (zgodnie z definicją w wytycznych WAG dotyczących dostępności treści internetowych (WCAG) 2.1 ) , zamiast luminancji.
To jest kod (w javascript):
Działający przykład można znaleźć w moim rozwidleniu codepen @ WebSeed, który powoduje zero błędów niskiego kontrastu w WAVE.
źródło