Chcę, aby użytkownicy na mojej stronie mogli wybrać kolor heksadecymalny, a chcę tylko wyświetlić biały tekst dla ciemnych kolorów i czarny tekst dla jasnych kolorów. Czy potrafisz wyliczyć jasność z kodu szesnastkowego (najlepiej z PHP)?Hex Code Brightness PHP?
Odpowiedz
$hex = "78ff2f"; //Bg color in hex, without any prefixing #!
//break up the color in its RGB components
$r = hexdec(substr($hex,0,2));
$g = hexdec(substr($hex,2,2));
$b = hexdec(substr($hex,4,2));
//do simple weighted avarage
//
//(This might be overly simplistic as different colors are perceived
// differently. That is a green of 128 might be brighter than a red of 128.
// But as long as it's just about picking a white or black text color...)
if($r + $g + $b > 382){
//bright color, use dark font
}else{
//dark color, use bright font
}
Konieczne jest przekonwertowanie wartości RGB na HLS/HSL (barwa światła i nasycenie), a następnie można użyć opcji Jasność, aby określić, czy potrzebny jest tekst jasny, czy ciemny.
This page ma pewne szczegóły dotyczące konwersji w PHP, a także wybierając kolor uzupełniający z tego.
Właśnie zauważyłem, że strona jest witryną astrologiczną - przepraszam, jeśli ktoś jest obrażony.
O miejscu astrologii: Tak, to jest przerażające ** ** (Nie, żartuję, ciekawe mają taką programowania związanego temat na ich stronie, ja! nie spodziewałbym się tego.) –
@Marcel - Myślę, że to pokazuje kod za ich wykresami. – ChrisF
Jeśli rozszerzenie ImageMagick aktywna, można po prostu utworzyć obiekt ImagickPixel, zadzwoń setColor z hex wartości, a następnie zadzwonić getHSL() (i dostać ostatnią pozycję otrzymanej tablicy przypuszczam) ...
zrobiłem jedną podobną - ale na podstawie ważenia każdego koloru (based on the C# version of this thread)
function readableColour($bg){
$r = hexdec(substr($bg,0,2));
$g = hexdec(substr($bg,2,2));
$b = hexdec(substr($bg,4,2));
$contrast = sqrt(
$r * $r * .241 +
$g * $g * .691 +
$b * $b * .068
);
if($contrast > 130){
return '000000';
}else{
return 'FFFFFF';
}
}
echo readableColour('000000'); // Output - FFFFFF
EDIT: Mały optymalizacja: Sqrt jest znana jako kosztowna operacja matematyczna, która jest prawdopodobnie niedopuszczalna w większości scenariuszy, ale w każdym razie można tego uniknąć, robiąc coś takiego.
function readableColour($bg){
$r = hexdec(substr($bg,0,2));
$g = hexdec(substr($bg,2,2));
$b = hexdec(substr($bg,4,2));
$squared_contrast = (
$r * $r * .299 +
$g * $g * .587 +
$b * $b * .114
);
if($squared_contrast > pow(130, 2)){
return '000000';
}else{
return 'FFFFFF';
}
}
echo readableColour('000000'); // Output - FFFFFF
To po prostu nie stosuje sqrt, zamiast tego uprawnienia pożądany kontrast odcięty przez dwa, co jest znacznie tańsze kalkulacja
To jest po prostu świetne! Dzięki! –
aby uzyskać wartości RGB w decu po prostu użyj tej linii: 'lista ($ r, $ g, $ b) = sscanf (kolor $,"% 02x% 02x% 02x ");' lub jeśli $ kolor zaczyna się od # 'lista ($ r, $ g, $ b) = sscanf ($ kolor," #% 02x% 02x% 02x ");' – JoTaRo
Wiem, że to bardzo stary temat, ale dla użytkowników, którzy pochodzi z "Wyszukiwarki Google", ten link może być tym, czego szuka. Rozglądałem się za coś takiego i myślę, że to dobry pomysł, aby umieścić go tutaj:
https://github.com/mexitek/phpColors
use Mexitek\PHPColors\Color;
// Initialize my color
$myBlue = new Color("#336699");
echo $myBlue->isLight(); // false
echo $myBlue->isDark(); // true
to wszystko.
Próbowałem inaczej podejść do tego, użyłem procentowej jasności HSL (odcień, nasycenie &), aby sprawdzić, czy kolor jest ciemny czy jasny. (Jak @chrisf powiedział w swojej odpowiedzi)
funkcja:
function colorislight($hex) {
$hex = str_replace('#', '', $hex);
$r = (hexdec(substr($hex, 0, 2))/255);
$g = (hexdec(substr($hex, 2, 2))/255);
$b = (hexdec(substr($hex, 4, 2))/255);
$lightness = round((((max($r, $g, $b) + min($r, $g, $b))/2) * 100));
return ($lightness >= 50 ? true : false);
}
Na przewodzie powrotnym sprawdza czy odsetek lekkość jest wyższa niż 50% i zwraca true, false w przeciwnym przypadku jest zwracana. Możesz go łatwo zmienić, aby zwracał wartość true, jeśli kolor ma 30% lekkości i tak dalej. Zmienna $lightness
może powrócić z 0 do 100 0, która jest najciemniejsza, a 100 najlżejsza.
jak korzystać z funkcji:
$color = '#111111';
if (colorislight($color)) {
echo 'this color is light';
}
else {
echo 'this color is dark';
}
Działa idealnie, nawet nie trzeba wchodzić w barwy i nasycenia! :) – Juddling
W moim przypadku lepiej działało 250 zamiast 382. Nie sądzę, że pełny zielony kolor (# 00ff00) powinien używać jasnego koloru czcionki, a pełna czerwień jest w porządku z ciemnym kolorem. Tylko mówię. –