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

Last change on this file was 113294, checked in by spip.franck@…, 2 months ago

Il parait que le futur c'est maintenant :-D

File size: 6.3 KB
Line 
1<?php
2/***************************************************************************\
3 *  SPIP, Systeme de publication pour l'internet                           *
4 *                                                                         *
5 *  Copyright (c) 2001-2019                                                *
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// https://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// https://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// https://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// https://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// https://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// https://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// https://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// https://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 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**/
134function 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**/
177function 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}
Note: See TracBrowser for help on using the repository browser.