[SPIP] ~spip v3.2.0-->v3.2.1
[lhc/web/www.git] / www / plugins-dist / filtres_images / filtres / couleurs.php
1 <?php
2 /***************************************************************************\
3 * SPIP, Systeme de publication pour l'internet *
4 * *
5 * Copyright (c) 2001-2016 *
6 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
7 * *
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 \***************************************************************************/
11
12 if (!defined('_ECRIRE_INC_VERSION')) {
13 return;
14 }
15
16 include_spip('inc/filtres_images_lib_mini');
17
18 /**
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
23 */
24
25 // https://code.spip.net/@couleur_extraire
26 function couleur_extraire($img, $x = 10, $y = 6) {
27 include_spip('filtres/images_lib');
28
29 return _image_couleur_extraire($img, $x, $y);
30 }
31
32
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);
37
38 $rvb = array_map('multiple_de_trois', $rvb);
39
40 return _couleur_dec_to_hex($rvb['red'], $rvb['green'], $rvb['blue']);
41 }
42
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));
48
49 return "$r$r$v$v$b$b";
50 }
51
52 // Lire la luminance relative d'une couleur
53 // de 0 à 1
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;
60 }
61
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
68
69 if (couleur_luminance_relative($couleur) > $limite) {
70 $couleur_texte = "ffffff";
71 } else {
72 $couleur_texte = "000000";
73 }
74
75 return $couleur_texte;
76 }
77
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"];
84
85 $couleur = _couleur_dec_to_hex($red, $green, $blue);
86
87 return $couleur;
88 }
89
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);
98 } else {
99 return $couleur;
100 }
101 }
102
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);
108 } else {
109 return $couleur;
110 }
111 }
112
113 /**
114 * Modifie la saturation de la couleur transmise
115 *
116 * Change la saturation en forçant le résultat sur une échelle absolue.
117 *
118 * @link https://www.spip.net/3326
119 * @example
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)
123 *
124 * @uses _couleur_hex_to_dec()
125 * @uses _couleur_dec_to_hex()
126 *
127 * @param string $couleur
128 * Couleur en écriture hexadécimale, tel que `ff3300`
129 * @param float $val
130 * Pourcentage désiré (entre 0 et 1)
131 * @return string
132 * Couleur en écriture hexadécimale.
133 **/
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"];
139
140 $max = max($r, $g, $b, 1);
141
142 $r = 255 - $r / $max * 255 * $val;
143 $g = 255 - $g / $max * 255 * $val;
144 $b = 255 - $b / $max * 255 * $val;
145
146 $couleur = _couleur_dec_to_hex($r, $g, $b);
147
148 return $couleur;
149
150 }
151
152 /**
153 * Modifie la luminance de la couleur transmise
154 *
155 * Change la luminance en forçant le résultat sur une échelle absolue.
156 *
157 * @link https://www.spip.net/3326
158 * @example
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)
163 *
164 * @uses _couleur_hex_to_dec()
165 * @uses couleur_saturation()
166 * @uses _couleur_rgb2hsl()
167 * @uses _couleur_hsl2rgb()
168 * @uses _couleur_dec_to_hex()
169 *
170 * @param string $couleur
171 * Couleur en écriture hexadécimale, tel que `ff3300`
172 * @param float $val
173 * Pourcentage désiré (entre 0 et 1)
174 * @return string
175 * Couleur en écriture hexadécimale.
176 **/
177 function couleur_luminance($couleur, $val) {
178 include_spip('filtres/images_lib');
179
180 $couleurs = _couleur_hex_to_dec($couleur);
181 $r = $couleurs["red"];
182 $g = $couleurs["green"];
183 $b = $couleurs["blue"];
184
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);
189 }
190
191
192 $couleur = _couleur_rgb2hsl($r, $g, $b);
193 $h = $couleur["h"];
194 $s = $couleur["s"];
195 $l = $couleur["l"];
196
197 $rgb = _couleur_hsl2rgb($h, $s, 1 - $val);
198 $r = $rgb["r"];
199 $g = $rgb["g"];
200 $b = $rgb["b"];
201
202 $retour = _couleur_dec_to_hex($r, $g, $b);
203
204 return $retour;
205 }