Aller au contenu

[Snippet #01 - PHP] color conversion

La conversion RGB/HSL en PHP ? Rien de plus simple

En partant des algorithmes fournis sur ce site, j'ai écris en PHP les fonctions de conversion RGB/HSL.

On en trouve des variantes un peu partout sur le web, mais certaines sont fausse, ou parlent à tort de HSL quand elles traitent du HSV... Bref, autant repartir sur de bonnes bases.

En plus des fonctions de conversion RGB/HSL, je vous propose quelques petites fonctions utilitaires, le tout à télécharger au bas de l'article.

Nettoyer un code couleur HTML

S'assurer qu'il est au bon format et se débarasser du "#" pour pouvoir le traiter sans souci.

<?php
//returns a clean 6 digit hex number as a string
function cleanHexColor($hex) {
    $hex = strtolower($hex);
    //remove the leading "#"
    if(strlen($hex) == 7 || strlen($hex) == 4)
        $hex = substr($hex, -(strlen($hex)-1));

    // $hex like "1a7"
    if(preg_match('/^[a-f0-9]{6}$/i', $hex))
        return $hex;
    // $hex like "162a7b"
    elseif(preg_match('/^[a-f0-9]{3}$/i', $hex))
        return $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    //any other format
    else
        return "000000";
}

Conversion HTML > RGB

Convertir un code de couleur hexadécimal (sans #) en RGB (3 valeurs de [0-255]).

<?php
//returns an array of 3 [0-255] int
function hex2rgb($hex) {
    return array(
        hexdec(substr($hex, 0, 2)),
        hexdec(substr($hex, 2, 2)),
        hexdec(substr($hex, 4, 2)),
    );
}

Conversion RGB > HTML

Convertir les valeurs RGB (3 valeurs de [0-255]) d'une couleur en un code HTML (sans #)

<?php
//returns a 6 digit hex number as a string
function rgb2hex($rgb) {
    return ""
        .substr("00".dechex(ceil($rgb[0])), -2)
        .substr("00".dechex(ceil($rgb[1])), -2)
        .substr("00".dechex(ceil($rgb[2])), -2)
    ;
}

Faire varier une couleur

Un petit snippet pour fournir des variations d'un couleur fournie en paramètre. Il suffit de définir quelle dimension (HSL : teinte, saturation ou luminosité) on souhaite garder constante, et la fonction retournera un tableau avec les variantes. A combiner avec les fonctions ci-dessus + rgb2hsl et hsl2rgb à télécharger plus bas.

<?php
//returns a 2 dimensional array of HSL values (as subarray of 3 values [0-1] floats)
function variationAround($hsl, $stepSize = 0.2,  $constant = "hue") {
    if($constant == "hue") {
        $i = 1; $j = 2;
    } elseif($constant == "sat") {
        $i = 0; $j = 2;
    }if($constant == "lum") {
        $i = 0; $j = 1;
    }

    $variations = array();  //resulting variations
    $hslTemp = array();     //stores current variation
    $mod = array();         //stores modulos for h, s & l

    $mod[0] = (float)(($hsl[0]*100) % ($stepSize * 100)) / 100;
    $mod[1] = (float)(($hsl[1]*100) % ($stepSize * 100)) / 100;
    $mod[2] = (float)(($hsl[2]*100) % ($stepSize * 100)) / 100;

    $hslTemp = $hsl;
    $hslTemp[$i] = $mod[$i];
    while($hslTemp[$i] <= 1) {
        $row = array();
        $hslTemp[$j] = $mod[$j];
        while($hslTemp[$j] <= 1) {
            $row[(string)$hslTemp[$j]] = array($hslTemp[0], $hslTemp[1], $hslTemp[2]);
            $hslTemp[$j] = (float)($hslTemp[$j] + $stepSize);
        }
        $variations[(string)$hslTemp[$i]] = $row;
        $hslTemp[$i] = (float)($hslTemp[$i] + $stepSize);
    }

    return $variations;
}

Permet par exemple d'obtenir, pour la couleur #22bb77 et à teinte constante :


sat lum0.030.230.430.630.83
0.09#070908#36403c#64786f#99aaa2#d0d8d5
0.29#060a08#2a4c3d#4e8e72#86bda4#c8e1d6
0.49#040c09#1e583e#38a474#73cfa6#bfe9d7
0.69#030d09#136440#22bb77#60e2a8#b6f2d7
0.89#010f09#076f41#0dd079#4df5aa#aefbd8

Télécharger les fonctions et un exemple d'utilisation

Contient :

  • color.lib.php : toutes les fonctions évoquées, dont rgb2hsl et hsl2rgb.
  • exemple.php : une implémentation utilisant ces fonctions pour afficher les variations autour d'une couleur.

Keep calm & taste the rainbow.