hexa2rgb() pour manipuler les couleurs

Ayant de besoin de spécifier de manière simple une couleur en entrée d'une fonction qui nécessite d'avoir les 3 composantes (rouge, vert, bleu) séparées, j'ai cherché une telle fonction sur le net et j'ai fini par créer la mienne, mélange de tout ce que j'ai pu trouver.

Pour un script de création de vignettes, j'ai besoin de passer une couleur de fond à GD, cette couleur de fond servant de remplissage par défaut si l'image d'origine n'a pas le même ratio que la vignette finale. GD, au niveau de sa fonction imagecolorallocate() par ex, attend la couleur sur 3 paramètres, que sont le rouge, vert et bleu.

Mais dans ma logique de toujours faire au plus simple pour les utilisateurs finaux (ici des développeurs utilisant mon script mais pas forcément des développeurs chevronnés), le plus logique m'a paru de demander une couleur au format hexa, format le plus utilisé sur le web que ce soit pour le HTML, les CSS ou autre ; le bon vieux #000000 pour le noir par ex. Ce code donnant d'ailleurs, en RGB, les valeurs suivantes : R = 0, G = 0, B = 0.

La fonction est d'ailleurs toute simple d'utilisation mais j'ai repris/amélioré deux points par rapport à ce que j'ai pu trouver (la fonction ci-après existe peut-être déjà mais je ne suis pas tombé dessus) :

  • Les valeurs d'entrée peuvent être indifféremment #000000, #000, 000000 ou 000, l'équivalence se fait automatiquement avant de faire le processus de conversion
  • Les valeurs de sorties peuvent être de deux types : un "bête" tableau contenant respectivement le rouge, le vert et le bleu ou alors un tableau associatif avec "red", "green" et "blue" pour les clés de ce tableau

Mais mieux qu'un long discours, voici la fonction qui comme toujours est très certainement améliorable :

function hexa2rgb ( $hexa, $indexed = FALSE ) {

    $hexa = trim($hexa, '#');
    
    if ( strlen($hexa) == 3 ) {
        $hexa = str_repeat($hexa{0}, 2).
                str_repeat($hexa{1}, 2).
                str_repeat($hexa{2}, 2);
    } // endif
    
    $int = hexdec($hexa);
    
    $result = array(
        'red'   => 0xFF & ( $int >> 0x10 ),
        'green' => 0xFF & ( $int >> 0x8 ),
        'blue'  => 0xFF & $int
    );
    
    return $indexed ? $result : array_values($result);

} // end of 'hexa2rgb()'

L'utilisation est toute simple, voici quelques exemples :

  • list($r, $g, $b) = hexa2rgb('#cc0000');
  • $color = hexa2rgb('#cc0000'); echo $color['red'];

Comme d'habitude, n'hésitez pas à faire vos remarques sur cette fonction, vos corrections ou améliorations seront toujours les bienvenues :-)

Posté le jeudi 18 décembre 2008 dans .

Commentaires

Ajouter un commentaire

Il n'est plus possible de réagir à cette entrée directement mais si vous pensez que votre intervention peut être intéressante, envoyez-moi votre commentaire, je l'ajouterai ici en votre nom.