php - colorscheme - html spec
Hex Code Brightness PHP? (6)
Quiero que los usuarios de mi sitio web puedan elegir un color hexadecimal, y solo quiero mostrar texto blanco para colores oscuros y texto negro para colores claros. ¿Puedes calcular el brillo a partir de un código hexadecimal (preferiblemente PHP)?
Debe convertir los valores RGB a HLS / HSL (luminosidad de tono y saturación) y luego puede usar la luminosidad para determinar si necesita texto claro o texto oscuro.
Esta página tiene algunos detalles sobre cómo realizar la conversión en PHP y cómo seleccionar colores complementarios.
Acabo de descubrir que el sitio es un sitio de astrología, así que pido disculpas si alguien se ofende.
Hice uno similar, pero basado en las ponderaciones de cada color (basado en la versión C # de este hilo)
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
EDITAR: pequeña optimización: Sqrt se conoce como una operación matemática costosa, que probablemente sea despreciable en la mayoría de los escenarios, pero de todos modos, podría evitarse haciendo algo como esto.
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
Simplemente no aplica el sqrt, sino que potencia el contraste de corte deseado en dos, lo que es un cálculo mucho más barato.
Intenté un enfoque diferente para esto, utilicé el porcentaje de luminosidad de HSL (tono, saturación y luminosidad) para comprobar si el color es oscuro o claro. (como dijo @chrisf en su respuesta)
función:
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);
}
En la línea de retorno, comprueba si el porcentaje de luminosidad es superior al 50% y devuelve verdadero, de lo contrario se devuelve falso. Puede cambiarlo fácilmente para que se vuelva verdadero si el color tiene un 30% de luminosidad y así sucesivamente. La variable $lightness
puede regresar de 0 a 100 siendo 0 la más oscura y 100 la más clara.
cómo utilizar la función:
$color = ''#111111'';
if ( colorislight($color) ) {
echo ''this color is light'';
}
else {
echo ''this color is dark'';
}
Sé que este es un tema muy antiguo, pero para los usuarios que provienen de "Búsqueda de Google", este enlace puede ser lo que están buscando. He buscado algo como esto y creo que es una buena idea publicarlo aquí:
https://github.com/mexitek/phpColors
use Mexitek/PHPColors/Color;
// Initialize my color
$myBlue = new Color("#336699");
echo $myBlue->isLight(); // false
echo $myBlue->isDark(); // true
Eso es.
Si tiene la extensión imagemagick activada, simplemente puede crear un objeto ImagickPixel, llamar a setColor con su valor hexadecimal y luego llamar a getHSL () (y obtener el último elemento de la matriz obtenida, supongo) ...
$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
}