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
ou000
, 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 :-)
Commentaires
-
zZz a écrit le 18/12/2008 :
Si je puis me permettre un commentaire d'électronicien chiant, pour les décalages de bits, il est plus lisible d'utiliser des entiers décimaux et donc d'écrire :
$a >> 16plutôt que :
$a >> 0x10
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.