2 /***************************************************************************\
3 * SPIP, Systeme de publication pour l'internet *
5 * Copyright (c) 2001-2014 *
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')) return;
14 // librairie de base du core
15 include_spip('inc/filtres_images_lib_mini');
17 function multiple_de_trois($val) {
18 return intval(round($val / 3) * 3);
22 * Transformation d'une couleur vectorielle RGB en HSV
23 * RGB entiers entre 0 et 255
24 * HSV float entre 0 et 1
31 function _couleur_rgb2hsv ($R,$G,$B) {
32 $var_R = ( $R / 255 ) ; //Where RGB values = 0 ÷ 255
33 $var_G = ( $G / 255 );
34 $var_B = ( $B / 255 );
36 $var_Min = min( $var_R, $var_G, $var_B ) ; //Min. value of RGB
37 $var_Max = max( $var_R, $var_G, $var_B ) ; //Max. value of RGB
38 $del_Max = $var_Max - $var_Min ; //Delta RGB value
41 $L = ( $var_Max +
$var_Min ) / 2;
43 if ( $del_Max == 0 ) //This is a gray, no chroma...
45 $H = 0 ; //HSL results = 0 ÷ 1
48 else //Chromatic data...
50 $S = $del_Max / $var_Max;
52 $del_R = ( ( ( $var_Max - $var_R ) / 6 ) +
( $del_Max / 2 ) ) / $del_Max;
53 $del_G = ( ( ( $var_Max - $var_G ) / 6 ) +
( $del_Max / 2 ) ) / $del_Max;
54 $del_B = ( ( ( $var_Max - $var_B ) / 6 ) +
( $del_Max / 2 ) ) / $del_Max;
56 if ( $var_R == $var_Max ) $H = $del_B - $del_G;
57 else if ( $var_G == $var_Max ) $H = ( 1 / 3 ) +
$del_R - $del_B;
58 else if ( $var_B == $var_Max ) $H = ( 2 / 3 ) +
$del_G - $del_R;
60 if ( $H < 0 ) $H = $H +
1;
61 if ( $H > 1 ) $H = $H - 1;
72 * Transformation d'une couleur vectorielle HSV en RGB
73 * HSV float entre 0 et 1
74 * RGB entiers entre 0 et 255
81 function _couleur_hsv2rgb ($H,$S,$V) {
83 if ( $S == 0 ) //HSV values = 0 ÷ 1
92 if ( $var_h == 6 ) $var_h = 0 ; //H must be < 1
93 $var_i = floor( $var_h ) ; //Or ... var_i = floor( var_h )
94 $var_1 = $V * ( 1 - $S );
95 $var_2 = $V * ( 1 - $S * ( $var_h - $var_i ) );
96 $var_3 = $V * ( 1 - $S * ( 1 - ( $var_h - $var_i ) ) );
99 if ( $var_i == 0 ) { $var_r = $V ; $var_g = $var_3 ; $var_b = $var_1 ; }
100 else if ( $var_i == 1 ) { $var_r = $var_2 ; $var_g = $V ; $var_b = $var_1 ; }
101 else if ( $var_i == 2 ) { $var_r = $var_1 ; $var_g = $V ; $var_b = $var_3 ; }
102 else if ( $var_i == 3 ) { $var_r = $var_1 ; $var_g = $var_2 ; $var_b = $V ; }
103 else if ( $var_i == 4 ) { $var_r = $var_3 ; $var_g = $var_1 ; $var_b = $V ; }
104 else { $var_r = $V ; $var_g = $var_1 ; $var_b = $var_2; }
106 $R = $var_r * 255; //RGB results = 0 ÷ 255
110 $ret["r"] = floor($R);
111 $ret["g"] = floor($G);
112 $ret["b"] = floor($B);
119 * Transformation d'une couleur RGB en HSL
120 * HSL float entre 0 et 1
121 * RGB entiers entre 0 et 255
128 function _couleur_rgb2hsl ($R,$G,$B) {
129 $var_R = ( $R / 255 ) ; //Where RGB values = 0 ÷ 255
130 $var_G = ( $G / 255 );
131 $var_B = ( $B / 255 );
133 $var_Min = min( $var_R, $var_G, $var_B ) ; //Min. value of RGB
134 $var_Max = max( $var_R, $var_G, $var_B ) ; //Max. value of RGB
135 $del_Max = $var_Max - $var_Min ; //Delta RGB value
137 $L = ( $var_Max +
$var_Min ) / 2;
139 if ( $del_Max == 0 ) //This is a gray, no chroma...
141 $H = 0 ; //HSL results = 0 ÷ 1
144 else //Chromatic data...
146 if ($L < 0.5 ) $S = $del_Max / ( $var_Max+
$var_Min);
147 else $S = $del_Max/ ( 2 - $var_Max - $var_Min);
149 $del_R = ( ( ( $var_Max- $var_R) / 6 ) +
( $del_Max / 2 ) ) / $del_Max;
150 $del_G = ( ( ( $var_Max- $var_G) / 6 ) +
( $del_Max / 2 ) ) / $del_Max;
151 $del_B = ( ( ( $var_Max- $var_B) / 6 ) +
( $del_Max / 2 ) ) / $del_Max;
153 if ( $var_R == $var_Max) $H= $del_B - $del_G;
154 else if ( $var_G == $var_Max) $H= ( 1 / 3 ) +
$del_R - $del_B;
155 else if ( $var_B == $var_Max) $H= ( 2 / 3 ) +
$del_G - $del_R;
157 if ( $H < 0 ) $H+
= 1;
158 if ( $H > 1 ) $H-= 1;
169 * Calcul d'une composante R, G ou B
171 * @param unknown_type $v1
172 * @param unknown_type $v2
173 * @param unknown_type $vH
176 function hue_2_rgb( $v1, $v2, $vH ) {
177 if ( $vH < 0 ) $vH +
= 1;
178 if ( $vH > 1 ) $vH -= 1;
179 if ( ( 6 * $vH ) < 1 ) return ( $v1 +
( $v2 - $v1 ) * 6 * $vH );
180 if ( ( 2 * $vH ) < 1 ) return ( $v2 );
181 if ( ( 3 * $vH ) < 2 ) return ( $v1 +
( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
187 * Transformation d'une couleur HSL en RGB
188 * HSL float entre 0 et 1
189 * RGB entiers entre 0 et 255
196 function _couleur_hsl2rgb ($H,$S,$L) {
198 if ( $S == 0 ) //HSV values = 0 -> 1
206 if ( $L < 0.5 ) $var_2 = $L * ( 1 +
$S );
207 else $var_2 = ( $L +
$S ) - ( $S * $L );
209 $var_1 = 2 * $L - $var_2;
211 $R = 255 * hue_2_rgb( $var_1, $var_2, $H +
( 1 / 3 ) ) ;
212 $G = 255 * hue_2_rgb( $var_1, $var_2, $H );
213 $B = 255 * hue_2_rgb( $var_1, $var_2, $H - ( 1 / 3 ) );
215 $ret["r"] = floor($R);
216 $ret["g"] = floor($G);
217 $ret["b"] = floor($B);
222 // A partir d'une image,
223 // recupere une couleur
224 // renvoit sous la forme hexadecimale ("F26C4E" par exemple).
225 // Par defaut, la couleur choisie se trouve un peu au-dessus du centre de l'image.
226 // On peut forcer un point en fixant $x et $y, entre 0 et 20.
227 // http://doc.spip.org/@image_couleur_extraire
229 function _image_couleur_extraire($img, $x=10, $y=6) {
230 static $couleur_extraite = array();
232 if (isset($couleur_extraite["$img-$x-$y"]))
233 return $couleur_extraite["$img-$x-$y"];
235 // valeur par defaut si l'image ne peut etre lue
238 $cache = _image_valeurs_trans($img, "coul-$x-$y", "txt");
240 return $couleur_extraite["$img-$x-$y"] = $defaut;
243 $fichier = $cache["fichier"];
244 $dest = $cache["fichier_dest"];
246 if (isset($couleur_extraite["$fichier-$x-$y"]))
247 return $couleur_extraite["$fichier-$x-$y"];
249 $creer = $cache["creer"];
252 if (@file_exists
($fichier)) {
253 $width = $cache["largeur"];
254 $height = $cache["hauteur"];
259 $thumb = imagecreate($newwidth, $newheight);
261 $source = $cache["fonction_imagecreatefrom"]($fichier);
263 imagepalettetotruecolor($source);
265 imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
269 $color_index = imagecolorat($thumb, $x, $y);
271 // make it human readable
272 $color_tran = imagecolorsforindex($thumb, $color_index);
274 } while ($color_tran['alpha']==127 AND $x<$newwidth AND $y<$newheight);
276 $couleur = _couleur_dec_to_hex($color_tran["red"], $color_tran["green"], $color_tran["blue"]);
282 // Mettre en cache le resultat
283 $couleur_extraite["$fichier-$x-$y"] = $couleur;
284 ecrire_fichier($dest,$couleur_extraite["$fichier-$x-$y"]);
287 lire_fichier($dest,$couleur_extraite["$fichier-$x-$y"]);
290 return $couleur_extraite["$img-$x-$y"]=$couleur_extraite["$fichier-$x-$y"];
293 // $src_img - a GD image resource
294 // $angle - degrees to rotate clockwise, in degrees
295 // returns a GD image resource
296 // script de php.net lourdement corrig'e
297 // (le bicubic deconnait completement,
298 // et j'ai ajoute la ponderation par la distance au pixel)
299 function _image_distance_pixel($xo, $yo, $x0, $y0) {
302 $d = 1 - (sqrt(($vx)*($vx) +
($vy)*($vy)) / sqrt(2));
308 * Decale une composante de couleur
315 function _image_decale_composante($coul, $gamma) {
316 $coul = $coul +
$gamma;
318 if ($coul > 255) $coul = 255;
319 if ($coul < 0) $coul = 0;
324 * Decalage d'une composante de couleur en sepia
331 function _image_decale_composante_127($coul, $val) {
332 if ($coul < 127) $y = round((($coul - 127) / 127) * $val) +
$val;
333 else if ($coul >= 127) $y = round((($coul - 127) / 128) * (255-$val)) +
$val;
337 if ($y > 255) $y = 255;