J’ai besoin, pour un site #SPIP sur lequel je travaille, d’interdire l’utilisation de couleurs trop vives dans l’interface. J’utilise beaucoup de couleurs, chaque titre de la page d’accueil est de la couleur a sa propre couleur, alors si on affiche des couleurs vives, ça devient un arbre de Noël (et ce n’est pas l’esprit du truc). Je veux que l’ensemble reste dans des tons « éteints ».
Pour cela, il suffit de limiter la valeur S (saturation) quand on passe la couleur en mode HSL (ou TSI en français).
Voici un bleu ni trop vif ni trop terne (valeur de S : 60% ; dans SPIP, on codera 0.6) :
Si on pousse la saturation à 100% (dans SPIP : 1), on obtient une belle couleur qui pète :
Et si on passe à 0%, on arrive au gris :
On notera que, tant qu’on ne modifie pas L (ou I), je continue donc à avoir des couleurs très lumineuses ou très foncées, et il faut donc que je prenne cela en compte dans mon interface (avec les usuels |couleur_foncer_si_claire
et autres outils bien pratiques pour gérer des interfaces qui changent de couleur).
C’est juste qu’ici, je veux limiter la valeur maximale de la saturation (le côté « couleur éteinte / couleur vive »). Pour cela, une petite fonction qui va bien :
function couleur_desaturer($couleur, $val) {
include_spip('filtres/images_lib');
$couleurs = _couleur_hex_to_dec($couleur);
$r = $couleurs["red"];
$g = $couleurs["green"];
$b = $couleurs["blue"];
$couleur = _couleur_rgb2hsl($r, $g, $b);
$h = $couleur["h"];
$s = $couleur["s"];
$l = $couleur["l"];
$rgb = _couleur_hsl2rgb($h, min($val,$s), $l);
$r = $rgb["r"];
$g = $rgb["g"];
$b = $rgb["b"];
$retour = _couleur_dec_to_hex($r, $g, $b);
return $retour;
}
Ça ne dénature donc pas systématiquement : ça fixe un seuil maximum.
La fonction est facile à modifier si, par exemple, on veut travailler uniquement avec des couleurs dans des tons pastel, on supprime la variable $val
, et on remplace la ligne :
$rgb = _couleur_hsl2rgb($h, min($val,$s), $l);
par
$rgb = _couleur_hsl2rgb($h, 0.4, 0.7);
(on fixe arbitrairement toutes les couleurs avec une saturation de 0.4 (légèrement terne mais pas trop) et une luminosité intermédiaire.