source: spip-zone/_core_/plugins/filtres_images/filtres/couleurs.php @ 104155

Last change on this file since 104155 was 104155, checked in by fil@…, 3 years ago

la luminance relative permet d'avoir un meilleur contraste sur pas mal de couleurs

File size: 6.3 KB
Line 
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
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16include_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// http://code.spip.net/@couleur_extraire
26function 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// http://code.spip.net/@couleur_web
34function 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// http://code.spip.net/@couleur_4096
44function 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// http://code.spip.net/@couleur_luminance_relative
57function 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// http://code.spip.net/@couleur_extreme
63function 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// http://code.spip.net/@couleur_inverser
79function 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// http://code.spip.net/@couleur_foncer_si_claire
91function 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// http://code.spip.net/@couleur_eclaircir_si_foncee
104function 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 http://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**/
134function couleur_saturation($couleur, $val) {
135        if ($couleur == "ffffff") {
136                $couleur = "eeeeee";
137        }
138
139        $couleurs = _couleur_hex_to_dec($couleur);
140        $r = 255 - $couleurs["red"];
141        $g = 255 - $couleurs["green"];
142        $b = 255 - $couleurs["blue"];
143
144        $max = max($r, $g, $b);
145
146        $r = 255 - $r / $max * 255 * $val;
147        $g = 255 - $g / $max * 255 * $val;
148        $b = 255 - $b / $max * 255 * $val;
149
150        $couleur = _couleur_dec_to_hex($r, $g, $b);
151
152        return $couleur;
153
154}
155
156/**
157 * Modifie la luminance de la couleur transmise
158 *
159 * Change la luminance en forçant le résultat sur une échelle absolue.
160 *
161 * @link http://www.spip.net/3326
162 * @example
163 *     - `[(#VAL{fc3924}|couleur_luminance{0})]` retourne blanc (ffffff),
164 *     - `[(#VAL{fc3924}|couleur_luminance{1})]` retourne noir (000000)
165 *     - `[(#VAL{fc3924}|couleur_luminance{0.5})]` retourne une luminance moyenne (fb1b03)
166 *     - `[(#VAL{fc3924}|couleur_luminance{0.2})]` retourne la couleur avec 20% de luminance (fda49a)
167 *
168 * @uses _couleur_hex_to_dec()
169 * @uses couleur_saturation()
170 * @uses _couleur_rgb2hsl()
171 * @uses _couleur_hsl2rgb()
172 * @uses _couleur_dec_to_hex()
173 *
174 * @param string $couleur
175 *      Couleur en écriture hexadécimale, tel que `ff3300`
176 * @param float $val
177 *      Pourcentage désiré (entre 0 et 1)
178 * @return string
179 *      Couleur en écriture hexadécimale.
180**/
181function couleur_luminance($couleur, $val) {
182        include_spip('filtres/images_lib');
183
184        $couleurs = _couleur_hex_to_dec($couleur);
185        $r = $couleurs["red"];
186        $g = $couleurs["green"];
187        $b = $couleurs["blue"];
188
189        // Cas etonnant: quand gris parfait, la correction de HSL ne fonctionne pas
190        // en revanche, couleur_saturation retourne exactement la bonne valeur
191        if ($r == $g && $g == $b) {
192                return couleur_saturation($couleur, $val);
193        }
194
195
196        $couleur = _couleur_rgb2hsl($r, $g, $b);
197        $h = $couleur["h"];
198        $s = $couleur["s"];
199        $l = $couleur["l"];
200
201        $rgb = _couleur_hsl2rgb($h, $s, 1 - $val);
202        $r = $rgb["r"];
203        $g = $rgb["g"];
204        $b = $rgb["b"];
205
206        $retour = _couleur_dec_to_hex($r, $g, $b);
207
208        return $retour;
209}
Note: See TracBrowser for help on using the repository browser.