2 /***************************************************************************\
3 * SPIP, Systeme de publication pour l'internet *
5 * Copyright (c) 2001-2019 *
6 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
9 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
10 \***************************************************************************/
12 if (!defined('_ECRIRE_INC_VERSION')) {
16 include_spip('inc/filtres_images_lib_mini');
19 * Toutes les fonctions couleur_xx de ce fichier :
20 * - prennent une couleur hexa sur 6 caracteres en entree (les couleurs web nommees sont admises aussi)
21 * - fournissent une couleur hexa en sortie
22 * - sont chainables les unes derrieres les autres dans toutes les combinaisons possibles
25 // https://code.spip.net/@couleur_extraire
26 function couleur_extraire($img, $x = 10, $y = 6) {
27 include_spip('filtres/images_lib');
29 return _image_couleur_extraire($img, $x, $y);
33 // https://code.spip.net/@couleur_web
34 function couleur_web($couleur) {
35 include_spip('filtres/images_lib');
36 $rvb = _couleur_hex_to_dec($couleur);
38 $rvb = array_map('multiple_de_trois', $rvb);
40 return _couleur_dec_to_hex($rvb['red'], $rvb['green'], $rvb['blue']);
43 // https://code.spip.net/@couleur_4096
44 function couleur_4096($couleur) {
45 $r = (substr($couleur, 0, 1));
46 $v = (substr($couleur, 2, 1));
47 $b = (substr($couleur, 4, 1));
49 return "$r$r$v$v$b$b";
52 // Lire la luminance relative d'une couleur
54 // cf. https://fr.wikipedia.org/wiki/Luminance#Luminance_relative
55 // cf. https://bl.ocks.org/Fil/cf03a054826ee5b3013577ecc0b009e6
56 // https://code.spip.net/@couleur_luminance_relative
57 function couleur_luminance_relative($couleur) {
58 $c = _couleur_hex_to_dec($couleur);
59 return (0.2126 * $c['red'] +
0.7152 * $c['green'] +
0.0722 * $c['blue']) / 255;
62 // https://code.spip.net/@couleur_extreme
63 function couleur_extreme($couleur, $limite = 0.5) {
64 // force la couleur au noir ou au blanc le plus proche
65 // -> donc couleur foncee devient noire
66 // et couleur claire devient blanche
67 // -> la limite est une valeur de 0 a 255, permettant de regler le point limite entre le passage noir ou blanc
69 if (couleur_luminance_relative($couleur) > $limite) {
70 $couleur_texte = "ffffff";
72 $couleur_texte = "000000";
75 return $couleur_texte;
78 // https://code.spip.net/@couleur_inverser
79 function couleur_inverser($couleur) {
80 $couleurs = _couleur_hex_to_dec($couleur);
81 $red = 255 - $couleurs["red"];
82 $green = 255 - $couleurs["green"];
83 $blue = 255 - $couleurs["blue"];
85 $couleur = _couleur_dec_to_hex($red, $green, $blue);
90 // https://code.spip.net/@couleur_foncer_si_claire
91 function couleur_foncer_si_claire($couleur, $seuil = 122) {
92 // ne foncer que les couleurs claires
93 // utile pour ecrire sur fond blanc,
94 // mais sans changer quand la couleur est deja foncee
95 if (couleur_luminance_relative($couleur) > $seuil / 255) {
96 include_spip("inc/filtres_images_mini");
97 return couleur_foncer($couleur);
103 // https://code.spip.net/@couleur_eclaircir_si_foncee
104 function couleur_eclaircir_si_foncee($couleur, $seuil = 123) {
105 if (couleur_luminance_relative($couleur) < $seuil / 255) {
106 include_spip("inc/filtres_images_mini");
107 return couleur_eclaircir($couleur);
114 * Modifie la saturation de la couleur transmise
116 * Change la saturation en forçant le résultat sur une échelle absolue.
118 * @link https://www.spip.net/3326
120 * - `[(#VAL{fc3924}|couleur_saturation{0})]` retourne blanc (ffffff),
121 * - `[(#VAL{fc3924}|couleur_saturation{1})]` retourne la couleur avec sa saturation au maximum (fb1800)
122 * - `[(#VAL{fc3924}|couleur_saturation{0.2})]` retourne la couleur avec 20% de saturation (fed0cc)
124 * @uses _couleur_hex_to_dec()
125 * @uses _couleur_dec_to_hex()
127 * @param string $couleur
128 * Couleur en écriture hexadécimale, tel que `ff3300`
130 * Pourcentage désiré (entre 0 et 1)
132 * Couleur en écriture hexadécimale.
134 function couleur_saturation($couleur, $val) {
135 $couleurs = _couleur_hex_to_dec($couleur);
136 $r = 255 - $couleurs["red"];
137 $g = 255 - $couleurs["green"];
138 $b = 255 - $couleurs["blue"];
140 $max = max($r, $g, $b, 1);
142 $r = 255 - $r / $max * 255 * $val;
143 $g = 255 - $g / $max * 255 * $val;
144 $b = 255 - $b / $max * 255 * $val;
146 $couleur = _couleur_dec_to_hex($r, $g, $b);
153 * Modifie la luminance de la couleur transmise
155 * Change la luminance en forçant le résultat sur une échelle absolue.
157 * @link https://www.spip.net/3326
159 * - `[(#VAL{fc3924}|couleur_luminance{0})]` retourne blanc (ffffff),
160 * - `[(#VAL{fc3924}|couleur_luminance{1})]` retourne noir (000000)
161 * - `[(#VAL{fc3924}|couleur_luminance{0.5})]` retourne une luminance moyenne (fb1b03)
162 * - `[(#VAL{fc3924}|couleur_luminance{0.2})]` retourne la couleur avec 20% de luminance (fda49a)
164 * @uses _couleur_hex_to_dec()
165 * @uses couleur_saturation()
166 * @uses _couleur_rgb2hsl()
167 * @uses _couleur_hsl2rgb()
168 * @uses _couleur_dec_to_hex()
170 * @param string $couleur
171 * Couleur en écriture hexadécimale, tel que `ff3300`
173 * Pourcentage désiré (entre 0 et 1)
175 * Couleur en écriture hexadécimale.
177 function couleur_luminance($couleur, $val) {
178 include_spip('filtres/images_lib');
180 $couleurs = _couleur_hex_to_dec($couleur);
181 $r = $couleurs["red"];
182 $g = $couleurs["green"];
183 $b = $couleurs["blue"];
185 // Cas etonnant: quand gris parfait, la correction de HSL ne fonctionne pas
186 // en revanche, couleur_saturation retourne exactement la bonne valeur
187 if ($r == $g && $g == $b) {
188 return couleur_saturation($couleur, $val);
192 $couleur = _couleur_rgb2hsl($r, $g, $b);
197 $rgb = _couleur_hsl2rgb($h, $s, 1 - $val);
202 $retour = _couleur_dec_to_hex($r, $g, $b);