Code hexadécimal luminosité PHP?
Je veux que les utilisateurs de mon site Web puissent choisir une couleur hexadécimale, et je veux juste afficher du texte blanc pour les couleurs sombres et du texte noir pour les couleurs claires. Pouvez-vous travailler sur la luminosité à partir d'un code hexadécimal (de préférence PHP)?
6 réponses
$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
}
J'en ai fait un similaire-mais basé sur des pondérations de chaque couleur (basé sur la version C# de ce fil)
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
Modifier: Petite optimisation: Sqrt est connu comme une opération mathématique coûteuse, ce qui est probablement négligeable dans la plupart des scénarios, mais de toute façon, il pourrait être évité en faisant quelque chose comme ça.
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
Il n'applique tout simplement pas le sqrt, au lieu de cela il alimente le contraste de coupure souhaité par deux, ce qui est un calcul beaucoup moins cher
Vous devez convertir les valeurs RVB en HLS/HSL (Hue Lightness and Saturation) vous pouvez ensuite utiliser la luminosité pour déterminer si vous avez besoin de texte clair ou de texte sombre.
Cette page a quelques détails sur la conversion en PHP ainsi que sur la sélection de couleurs complémentaires.
je viens de constater que le site est un site d'astrologie-donc des excuses si quelqu'un est offensé.
Je sais que c'est un sujet très ancien, mais pour les utilisateurs qui viennent de "recherche Google", ce lien peut être ce qu'ils recherchent. J'ai cherché quelque chose comme ça et je pense que c'est une bonne idée de le poster ici:
Https://github.com/mexitek/phpColors
use Mexitek\PHPColors\Color;
// Initialize my color
$myBlue = new Color("#336699");
echo $myBlue->isLight(); // false
echo $myBlue->isDark(); // true
C'est ça.
Si vous avez l'extension imagemagick activée, vous pouvez simplement créer un objet ImagickPixel, appeler setColor avec votre valeur hexadécimale, puis appeler getHSL () (et obtenir le dernier élément du tableau obtenu je suppose)...
J'ai essayé une approche différente à cela, j'ai utilisé HSL (teinte, saturation et légèreté) pourcentage de légèreté pour vérifier si la couleur est sombre ou claire. (comme @chrisf a dit dans sa réponse)
Fonction:
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);
}
Sur la ligne de retour, il vérifie si le pourcentage de légèreté est supérieur à 50% et renvoie true sinon false est renvoyé. Vous pouvez facilement le changer pour retourner true si la couleur a 30% de légèreté et ainsi de suite. La variable $lightness
peut retourner de 0 à 100 0 étant la plus sombre et 100 étant le plus léger.
Comment utiliser la fonction:
$color = '#111111';
if ( colorislight($color) ) {
echo 'this color is light';
}
else {
echo 'this color is dark';
}