2010-06-10 17 views
28

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

40
$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 
} 
+0

Działa idealnie, nawet nie trzeba wchodzić w barwy i nasycenia! :) – Juddling

+0

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ę. –

2

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.

+1

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.) –

+0

@Marcel - Myślę, że to pokazuje kod za ich wykresami. – ChrisF

1

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) ...

17

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

+0

To jest po prostu świetne! Dzięki! –

+0

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

1

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.

0

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'; 
}