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

29
demandé sur Marcel Korpel 2010-06-10 18:05:28

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
}
42
répondu 0scar 2010-06-10 14:18:56

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

18
répondu Mikey 2017-06-28 22:12:49

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

2
répondu ChrisF 2010-06-10 14:13:44

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.

2
répondu Andrei Surdu 2015-01-29 17:57:55

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

1
répondu greg0ire 2010-06-10 14:13:34

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';
}
0
répondu Jake 2015-09-10 02:29:07