source: spip-zone/_core_/plugins/filtres_images/filtres/images_lib.php @ 36679

Last change on this file since 36679 was 36679, checked in by cedric@…, 10 years ago

oups, et le filtre couleur_extraire visant a retrouver une couleur, ne pas s'arreter au premier pixel si il est transparent, mais se deplacer en diagonale pour en trouver un significatif

File size: 9.2 KB
Line 
1<?php
2/***************************************************************************\
3 *  SPIP, Systeme de publication pour l'internet                           *
4 *                                                                         *
5 *  Copyright (c) 2001-2009                                                *
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// librairie de base du core
13include_spip('inc/filtres_images_lib_mini');
14
15function multiple_de_trois($val) {
16        return intval(round($val / 3) * 3);
17}
18
19/**
20 * Transformation d'une couleur vectorielle RGB en HSV
21 * RGB entiers entre 0 et 255
22 * HSV float entre 0 et 1
23 *
24 * @param int $R
25 * @param int $G
26 * @param int $B
27 * @return array
28 */
29function _couleur_rgb2hsv ($R,$G,$B) {
30        $var_R = ( $R / 255 ) ;                    //Where RGB values = 0 ÷ 255
31        $var_G = ( $G / 255 );
32        $var_B = ( $B / 255 );
33
34        $var_Min = min( $var_R, $var_G, $var_B ) ;   //Min. value of RGB
35        $var_Max = max( $var_R, $var_G, $var_B ) ;   //Max. value of RGB
36        $del_Max = $var_Max - $var_Min  ;           //Delta RGB value
37
38        $V = $var_Max;
39        $L = ( $var_Max + $var_Min ) / 2;
40       
41        if ( $del_Max == 0 )                     //This is a gray, no chroma...
42        {
43           $H = 0 ;                            //HSL results = 0 ÷ 1
44           $S = 0 ;
45        }
46        else                                    //Chromatic data...
47        {
48           $S = $del_Max / $var_Max;
49       
50           $del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
51           $del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
52           $del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
53       
54           if      ( $var_R == $var_Max ) $H = $del_B - $del_G;
55           else if ( $var_G == $var_Max ) $H = ( 1 / 3 ) + $del_R - $del_B;
56           else if ( $var_B == $var_Max ) $H = ( 2 / 3 ) + $del_G - $del_R;
57       
58           if ( $H < 0 )  $H =  $H + 1;
59           if ( $H > 1 )  $H = $H - 1;
60        }
61                               
62        $ret["h"] = $H;
63        $ret["s"] = $S;
64        $ret["v"] = $V;
65       
66        return $ret;
67}
68
69/**
70 * Transformation d'une couleur vectorielle HSV en RGB
71 * HSV float entre 0 et 1
72 * RGB entiers entre 0 et 255
73 *
74 * @param float $H
75 * @param float $S
76 * @param float $V
77 * @return array
78 */
79function _couleur_hsv2rgb ($H,$S,$V) {
80       
81        if ( $S == 0 )                       //HSV values = 0 ÷ 1
82        {
83           $R = $V * 255;
84           $G = $V * 255;
85           $B = $V * 255;
86        }
87        else
88        {
89           $var_h = $H * 6;
90           if ( $var_h == 6 ) $var_h = 0 ;     //H must be < 1
91           $var_i = floor( $var_h )  ;           //Or ... var_i = floor( var_h )
92           $var_1 = $V * ( 1 - $S );
93           $var_2 = $V * ( 1 - $S * ( $var_h - $var_i ) );
94           $var_3 = $V * ( 1 - $S * ( 1 - ( $var_h - $var_i ) ) );
95       
96       
97           if      ( $var_i == 0 ) { $var_r = $V     ; $var_g = $var_3 ; $var_b = $var_1 ; }
98           else if ( $var_i == 1 ) { $var_r = $var_2 ; $var_g = $V     ; $var_b = $var_1 ; }
99           else if ( $var_i == 2 ) { $var_r = $var_1 ; $var_g = $V     ; $var_b = $var_3 ; }
100           else if ( $var_i == 3 ) { $var_r = $var_1 ; $var_g = $var_2 ; $var_b = $V ;     }
101           else if ( $var_i == 4 ) { $var_r = $var_3 ; $var_g = $var_1 ; $var_b = $V ; }
102           else                   { $var_r = $V     ; $var_g = $var_1 ; $var_b = $var_2; }
103       
104           $R = $var_r * 255;                  //RGB results = 0 ÷ 255
105           $G = $var_g * 255;
106           $B = $var_b * 255;
107        }
108        $ret["r"] = floor($R);
109        $ret["g"] = floor($G);
110        $ret["b"] = floor($B);
111       
112        return $ret;
113}
114
115
116/**
117 * Transformation d'une couleur RGB en HSL
118 * HSL float entre 0 et 1
119 * RGB entiers entre 0 et 255
120 *
121 * @param int $R
122 * @param int $G
123 * @param int $B
124 * @return array
125 */
126function _couleur_rgb2hsl ($R,$G,$B) {
127        $var_R = ( $R / 255 ) ;                    //Where RGB values = 0 ÷ 255
128        $var_G = ( $G / 255 );
129        $var_B = ( $B / 255 );
130
131        $var_Min = min( $var_R, $var_G, $var_B ) ;   //Min. value of RGB
132        $var_Max = max( $var_R, $var_G, $var_B ) ;   //Max. value of RGB
133        $del_Max = $var_Max - $var_Min  ;           //Delta RGB value
134
135        $L = ( $var_Max + $var_Min ) / 2;
136       
137        if ( $del_Max == 0 )                     //This is a gray, no chroma...
138        {
139           $H = 0 ;                            //HSL results = 0 ÷ 1
140           $S = 0 ;
141        }
142        else                                    //Chromatic data...
143        {
144                if ($L < 0.5 ) $S = $del_Max / ( $var_Max+ $var_Min);
145                else $S = $del_Max/ ( 2 - $var_Max - $var_Min);
146
147                $del_R = ( ( ( $var_Max- $var_R) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
148                $del_G = ( ( ( $var_Max- $var_G) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
149                $del_B = ( ( ( $var_Max- $var_B) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
150
151                if ( $var_R == $var_Max) $H= $del_B - $del_G;
152                else if ( $var_G == $var_Max) $H= ( 1 / 3 ) + $del_R - $del_B;
153                else if ( $var_B == $var_Max) $H= ( 2 / 3 ) + $del_G - $del_R;
154
155                if ( $H < 0 ) $H+= 1;
156                if ( $H > 1 ) $H-= 1;
157        }
158                               
159        $ret["h"] = $H;
160        $ret["s"] = $S;
161        $ret["l"] = $L;
162       
163        return $ret;
164}
165
166/**
167 * Calcul d'une composante R, G ou B
168 *
169 * @param unknown_type $v1
170 * @param unknown_type $v2
171 * @param unknown_type $vH
172 * @return float
173 */
174function hue_2_rgb( $v1, $v2, $vH ) {
175   if ( $vH < 0 ) $vH += 1;
176   if ( $vH > 1 ) $vH -= 1;
177   if ( ( 6 * $vH ) < 1 ) return ( $v1 + ( $v2 - $v1 ) * 6 * $vH );
178   if ( ( 2 * $vH ) < 1 ) return ( $v2 );
179   if ( ( 3 * $vH ) < 2 ) return ( $v1 + ( $v2 - $v1 ) * ( ( 2 / 3 ) - $vH ) * 6 );
180   return ( $v1 );
181}
182
183
184/**
185 * Transformation d'une couleur HSL en RGB
186 * HSL float entre 0 et 1
187 * RGB entiers entre 0 et 255
188 *
189 * @param float $H
190 * @param float $S
191 * @param float $L
192 * @return array
193 */
194function _couleur_hsl2rgb ($H,$S,$L) {
195       
196        if ( $S == 0 )                       //HSV values = 0 -> 1
197        {
198           $R = $V * 255;
199           $G = $V * 255;
200           $B = $V * 255;
201        }
202        else
203        {
204                if ( $L < 0.5 ) $var_2 = $L * ( 1 + $S );
205                else            $var_2 = ( $L + $S ) - ( $S * $L );
206
207                $var_1 = 2 * $L - $var_2;
208
209                $R = 255 * hue_2_rgb( $var_1, $var_2, $H + ( 1 / 3 ) ) ;
210                $G = 255 * hue_2_rgb( $var_1, $var_2, $H );
211                $B = 255 * hue_2_rgb( $var_1, $var_2, $H - ( 1 / 3 ) );
212        }
213        $ret["r"] = floor($R);
214        $ret["g"] = floor($G);
215        $ret["b"] = floor($B);
216       
217        return $ret;
218}
219
220// A partir d'une image,
221// recupere une couleur
222// renvoit sous la forme hexadecimale ("F26C4E" par exemple).
223// Par defaut, la couleur choisie se trouve un peu au-dessus du centre de l'image.
224// On peut forcer un point en fixant $x et $y, entre 0 et 20.
225// http://doc.spip.org/@image_couleur_extraire
226
227function _image_couleur_extraire($img, $x=10, $y=6) {
228        static $couleur_extraite = array();
229       
230        if (isset($couleur_extraite["$img-$x-$y"]))
231                return $couleur_extraite["$img-$x-$y"];
232
233        // valeur par defaut si l'image ne peut etre lue
234        $defaut = "F26C4E";
235
236        $cache = _image_valeurs_trans($img, "coul-$x-$y", "txt");
237        if (!$cache) 
238                return $couleur_extraite["$img-$x-$y"] = $defaut;
239
240       
241        $fichier = $cache["fichier"];   
242        $dest = $cache["fichier_dest"];
243
244        if (isset($couleur_extraite["$fichier-$x-$y"]))
245                return $couleur_extraite["$fichier-$x-$y"];
246       
247        $creer = $cache["creer"];
248       
249        if ($creer) {
250                if (@file_exists($fichier)) {
251                        $width = $cache["largeur"];
252                        $height = $cache["hauteur"];
253               
254                        $newwidth = 20;
255                        $newheight = 20;
256               
257                        $thumb = imagecreate($newwidth, $newheight);
258
259                        $source = $cache["fonction_imagecreatefrom"]($fichier);
260                       
261                        imagepalettetotruecolor($source);
262
263                        imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
264
265                        do {
266                                // get a color
267                                $color_index = imagecolorat($thumb, $x, $y);
268
269                                // make it human readable
270                                $color_tran = imagecolorsforindex($thumb, $color_index);
271                                $x++; $y++;
272                        } while ($color_tran['alpha']==127 AND $x<$newwidth AND $y<$newheight);
273                       
274                        $couleur = _couleur_dec_to_hex($color_tran["red"], $color_tran["green"], $color_tran["blue"]);
275                }
276                else {
277                        $couleur = $defaut;
278                }
279               
280                // Mettre en cache le resultat
281                $couleur_extraite["$fichier-$x-$y"] = $couleur;
282                ecrire_fichier($dest,$couleur_extraite["$fichier-$x-$y"]);
283        }
284        else {
285                lire_fichier($dest,$couleur_extraite["$fichier-$x-$y"]);
286        }
287       
288        return $couleur_extraite["$img-$x-$y"]=$couleur_extraite["$fichier-$x-$y"];
289}
290
291// $src_img - a GD image resource
292// $angle - degrees to rotate clockwise, in degrees
293// returns a GD image resource
294// script de php.net lourdement corrig'e
295// (le bicubic deconnait completement,
296// et j'ai ajoute la ponderation par la distance au pixel)
297function _image_distance_pixel($xo, $yo, $x0, $y0) {
298        $vx = $xo - $x0;
299        $vy = $yo - $y0;
300        $d = 1 - (sqrt(($vx)*($vx) + ($vy)*($vy)) / sqrt(2));
301        return $d;
302}
303
304
305/**
306 * Decale une composante de couleur
307 * entier de 0 a 255
308 *
309 * @param int $coul
310 * @param int $gamma
311 * @return int
312 */
313function _image_decale_composante($coul, $gamma) {
314        $coul = $coul + $gamma;
315       
316        if ($coul > 255) $coul = 255;
317        if ($coul < 0) $coul = 0;
318        return $coul;
319}
320
321/**
322 * Decalage d'une composante de couleur en sepia
323 * entier de 0 a 255
324 *
325 * @param int $coul
326 * @param int $val
327 * @return int
328 */
329function _image_decale_composante_127($coul, $val) {
330        if ($coul < 127) $y = round((($coul - 127) / 127) * $val) + $val;
331        else if ($coul >= 127) $y = round((($coul - 127) / 128) * (255-$val)) + $val;
332        else $y= $coul;
333       
334        if ($y < 0) $y = 0;
335        if ($y > 255) $y = 255;
336        return $y;
337}
338
339?>
Note: See TracBrowser for help on using the repository browser.