Changeset 93611 in spip-zone for _core_/plugins/filtres_images/filtres/images_lib.php
- Timestamp:
- Dec 13, 2015, 11:35:58 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
_core_/plugins/filtres_images/filtres/images_lib.php
r93092 r93611 10 10 \***************************************************************************/ 11 11 12 if (!defined('_ECRIRE_INC_VERSION')) return; 12 if (!defined('_ECRIRE_INC_VERSION')) { 13 return; 14 } 13 15 14 16 // librairie de base du core … … 16 18 17 19 function multiple_de_trois($val) { 18 return intval(round($val / 3) *3);20 return intval(round($val/3)*3); 19 21 } 20 22 … … 23 25 * RGB entiers entre 0 et 255 24 26 * HSV float entre 0 et 1 25 * 27 * 26 28 * @param int $R 27 29 * @param int $G … … 29 31 * @return array 30 32 */ 31 function _couleur_rgb2hsv 32 $var_R = ( $R / 255 ); //Where RGB values = 0 ÷ 25533 $var_G = ( $G / 255);34 $var_B = ( $B / 255);35 36 $var_Min = min( $var_R, $var_G, $var_B ); //Min. value of RGB37 $var_Max = max( $var_R, $var_G, $var_B ); //Max. value of RGB38 $del_Max = $var_Max - $var_Min; //Delta RGB value33 function _couleur_rgb2hsv($R, $G, $B) { 34 $var_R = ($R/255); //Where RGB values = 0 ÷ 255 35 $var_G = ($G/255); 36 $var_B = ($B/255); 37 38 $var_Min = min($var_R, $var_G, $var_B); //Min. value of RGB 39 $var_Max = max($var_R, $var_G, $var_B); //Max. value of RGB 40 $del_Max = $var_Max-$var_Min; //Delta RGB value 39 41 40 42 $V = $var_Max; 41 $L = ( $var_Max + $var_Min ) / 2; 42 43 if ( $del_Max == 0 ) //This is a gray, no chroma... 44 { 45 $H = 0 ; //HSL results = 0 ÷ 1 46 $S = 0 ; 47 } 48 else //Chromatic data... 49 { 50 $S = $del_Max / $var_Max; 51 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; 55 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; 59 60 if ( $H < 0 ) $H = $H + 1; 61 if ( $H > 1 ) $H = $H - 1; 62 } 63 43 $L = ($var_Max+$var_Min)/2; 44 45 if ($del_Max == 0) //This is a gray, no chroma... 46 { 47 $H = 0; //HSL results = 0 ÷ 1 48 $S = 0; 49 } else //Chromatic data... 50 { 51 $S = $del_Max/$var_Max; 52 53 $del_R = ((($var_Max-$var_R)/6)+($del_Max/2))/$del_Max; 54 $del_G = ((($var_Max-$var_G)/6)+($del_Max/2))/$del_Max; 55 $del_B = ((($var_Max-$var_B)/6)+($del_Max/2))/$del_Max; 56 57 if ($var_R == $var_Max) { 58 $H = $del_B-$del_G; 59 } else { 60 if ($var_G == $var_Max) { 61 $H = (1/3)+$del_R-$del_B; 62 } else { 63 if ($var_B == $var_Max) { 64 $H = (2/3)+$del_G-$del_R; 65 } 66 } 67 } 68 69 if ($H < 0) { 70 $H = $H+1; 71 } 72 if ($H > 1) { 73 $H = $H-1; 74 } 75 } 76 64 77 $ret["h"] = $H; 65 78 $ret["s"] = $S; 66 79 $ret["v"] = $V; 67 80 68 81 return $ret; 69 82 } … … 73 86 * HSV float entre 0 et 1 74 87 * RGB entiers entre 0 et 255 75 * 88 * 76 89 * @param float $H 77 90 * @param float $S … … 79 92 * @return array 80 93 */ 81 function _couleur_hsv2rgb ($H, $S, $V) { 82 83 if ( $S == 0 ) //HSV values = 0 ÷ 1 84 { 85 $R = $V * 255; 86 $G = $V * 255; 87 $B = $V * 255; 88 } 89 else 90 { 91 $var_h = $H * 6; 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 ) ) ); 97 98 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; } 105 106 $R = $var_r * 255; //RGB results = 0 ÷ 255 107 $G = $var_g * 255; 108 $B = $var_b * 255; 94 function _couleur_hsv2rgb($H, $S, $V) { 95 96 if ($S == 0) //HSV values = 0 ÷ 1 97 { 98 $R = $V*255; 99 $G = $V*255; 100 $B = $V*255; 101 } else { 102 $var_h = $H*6; 103 if ($var_h == 6) { 104 $var_h = 0; 105 } //H must be < 1 106 $var_i = floor($var_h); //Or ... var_i = floor( var_h ) 107 $var_1 = $V*(1-$S); 108 $var_2 = $V*(1-$S*($var_h-$var_i)); 109 $var_3 = $V*(1-$S*(1-($var_h-$var_i))); 110 111 112 if ($var_i == 0) { 113 $var_r = $V; 114 $var_g = $var_3; 115 $var_b = $var_1; 116 } else { 117 if ($var_i == 1) { 118 $var_r = $var_2; 119 $var_g = $V; 120 $var_b = $var_1; 121 } else { 122 if ($var_i == 2) { 123 $var_r = $var_1; 124 $var_g = $V; 125 $var_b = $var_3; 126 } else { 127 if ($var_i == 3) { 128 $var_r = $var_1; 129 $var_g = $var_2; 130 $var_b = $V; 131 } else { 132 if ($var_i == 4) { 133 $var_r = $var_3; 134 $var_g = $var_1; 135 $var_b = $V; 136 } else { 137 $var_r = $V; 138 $var_g = $var_1; 139 $var_b = $var_2; 140 } 141 } 142 } 143 } 144 } 145 146 $R = $var_r*255; //RGB results = 0 ÷ 255 147 $G = $var_g*255; 148 $B = $var_b*255; 109 149 } 110 150 $ret["r"] = floor($R); 111 151 $ret["g"] = floor($G); 112 152 $ret["b"] = floor($B); 113 153 114 154 return $ret; 115 155 } … … 120 160 * HSL float entre 0 et 1 121 161 * RGB entiers entre 0 et 255 122 * 162 * 123 163 * @param int $R 124 164 * @param int $G … … 126 166 * @return array 127 167 */ 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 ); 132 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 136 137 $L = ( $var_Max + $var_Min ) / 2; 138 139 if ( $del_Max == 0 ) //This is a gray, no chroma... 140 { 141 $H = 0 ; //HSL results = 0 ÷ 1 142 $S = 0 ; 143 } 144 else //Chromatic data... 145 { 146 if ($L < 0.5 ) $S = $del_Max / ( $var_Max+ $var_Min); 147 else $S = $del_Max/ ( 2 - $var_Max - $var_Min); 148 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; 152 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; 156 157 if ( $H < 0 ) $H+= 1; 158 if ( $H > 1 ) $H-= 1; 159 } 160 168 function _couleur_rgb2hsl($R, $G, $B) { 169 $var_R = ($R/255); //Where RGB values = 0 ÷ 255 170 $var_G = ($G/255); 171 $var_B = ($B/255); 172 173 $var_Min = min($var_R, $var_G, $var_B); //Min. value of RGB 174 $var_Max = max($var_R, $var_G, $var_B); //Max. value of RGB 175 $del_Max = $var_Max-$var_Min; //Delta RGB value 176 177 $L = ($var_Max+$var_Min)/2; 178 179 if ($del_Max == 0) //This is a gray, no chroma... 180 { 181 $H = 0; //HSL results = 0 ÷ 1 182 $S = 0; 183 } else //Chromatic data... 184 { 185 if ($L < 0.5) { 186 $S = $del_Max/($var_Max+$var_Min); 187 } else { 188 $S = $del_Max/(2-$var_Max-$var_Min); 189 } 190 191 $del_R = ((($var_Max-$var_R)/6)+($del_Max/2))/$del_Max; 192 $del_G = ((($var_Max-$var_G)/6)+($del_Max/2))/$del_Max; 193 $del_B = ((($var_Max-$var_B)/6)+($del_Max/2))/$del_Max; 194 195 if ($var_R == $var_Max) { 196 $H = $del_B-$del_G; 197 } else { 198 if ($var_G == $var_Max) { 199 $H = (1/3)+$del_R-$del_B; 200 } else { 201 if ($var_B == $var_Max) { 202 $H = (2/3)+$del_G-$del_R; 203 } 204 } 205 } 206 207 if ($H < 0) { 208 $H += 1; 209 } 210 if ($H > 1) { 211 $H -= 1; 212 } 213 } 214 161 215 $ret["h"] = $H; 162 216 $ret["s"] = $S; 163 217 $ret["l"] = $L; 164 218 165 219 return $ret; 166 220 } 167 221 168 222 /** 169 * Calcul d'une composante R, G ou B 223 * Calcul d'une composante R, G ou B 170 224 * 171 225 * @param unknown_type $v1 … … 174 228 * @return float 175 229 */ 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 ); 182 return ( $v1 ); 230 function hue_2_rgb($v1, $v2, $vH) { 231 if ($vH < 0) { 232 $vH += 1; 233 } 234 if ($vH > 1) { 235 $vH -= 1; 236 } 237 if ((6*$vH) < 1) { 238 return ($v1+($v2-$v1)*6*$vH); 239 } 240 if ((2*$vH) < 1) { 241 return ($v2); 242 } 243 if ((3*$vH) < 2) { 244 return ($v1+($v2-$v1)*((2/3)-$vH)*6); 245 } 246 247 return ($v1); 183 248 } 184 249 … … 194 259 * @return array 195 260 */ 196 function _couleur_hsl2rgb ($H, $S, $L) { 197 198 if ( $S == 0 ) //HSV values = 0 -> 1 199 { 200 $R = $L * 255; 201 $G = $L * 255; 202 $B = $L * 255; 203 } 204 else 205 { 206 if ( $L < 0.5 ) $var_2 = $L * ( 1 + $S ); 207 else $var_2 = ( $L + $S ) - ( $S * $L ); 208 209 $var_1 = 2 * $L - $var_2; 210 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 ) ); 261 function _couleur_hsl2rgb($H, $S, $L) { 262 263 if ($S == 0) //HSV values = 0 -> 1 264 { 265 $R = $L*255; 266 $G = $L*255; 267 $B = $L*255; 268 } else { 269 if ($L < 0.5) { 270 $var_2 = $L*(1+$S); 271 } else { 272 $var_2 = ($L+$S)-($S*$L); 273 } 274 275 $var_1 = 2*$L-$var_2; 276 277 $R = 255*hue_2_rgb($var_1, $var_2, $H+(1/3)); 278 $G = 255*hue_2_rgb($var_1, $var_2, $H); 279 $B = 255*hue_2_rgb($var_1, $var_2, $H-(1/3)); 214 280 } 215 281 $ret["r"] = floor($R); 216 282 $ret["g"] = floor($G); 217 283 $ret["b"] = floor($B); 218 284 219 285 return $ret; 220 286 } … … 229 295 function _image_couleur_extraire($img, $x = 10, $y = 6) { 230 296 static $couleur_extraite = array(); 231 232 if (isset($couleur_extraite["$img-$x-$y"])) 297 298 if (isset($couleur_extraite["$img-$x-$y"])) { 233 299 return $couleur_extraite["$img-$x-$y"]; 300 } 234 301 235 302 // valeur par defaut si l'image ne peut etre lue … … 237 304 238 305 $cache = _image_valeurs_trans($img, "coul-$x-$y", "txt"); 239 if (!$cache) 306 if (!$cache) { 240 307 return $couleur_extraite["$img-$x-$y"] = $defaut; 241 242 243 $fichier = $cache["fichier"]; 308 } 309 310 311 $fichier = $cache["fichier"]; 244 312 $dest = $cache["fichier_dest"]; 245 313 246 if (isset($couleur_extraite["$fichier-$x-$y"])) 314 if (isset($couleur_extraite["$fichier-$x-$y"])) { 247 315 return $couleur_extraite["$fichier-$x-$y"]; 248 316 } 317 249 318 $creer = $cache["creer"]; 250 319 251 320 if ($creer) { 252 321 if (@file_exists($fichier)) { 253 322 $width = $cache["largeur"]; 254 323 $height = $cache["hauteur"]; 255 324 256 325 $newwidth = 20; 257 326 $newheight = 20; 258 327 259 328 $thumb = imagecreate($newwidth, $newheight); 260 329 261 330 $source = $cache["fonction_imagecreatefrom"]($fichier); 262 331 263 332 imagepalettetotruecolor($source); 264 333 … … 271 340 // make it human readable 272 341 $color_tran = imagecolorsforindex($thumb, $color_index); 273 $x++; $y++; 274 } while ($color_tran['alpha']==127 AND $x<$newwidth AND $y<$newheight); 275 342 $x++; 343 $y++; 344 } while ($color_tran['alpha'] == 127 AND $x < $newwidth AND $y < $newheight); 345 276 346 $couleur = _couleur_dec_to_hex($color_tran["red"], $color_tran["green"], $color_tran["blue"]); 277 } 278 else { 347 } else { 279 348 $couleur = $defaut; 280 349 } 281 350 282 351 // Mettre en cache le resultat 283 352 $couleur_extraite["$fichier-$x-$y"] = $couleur; 284 ecrire_fichier($dest,$couleur_extraite["$fichier-$x-$y"]); 285 } 286 else { 287 lire_fichier($dest,$couleur_extraite["$fichier-$x-$y"]); 288 } 289 290 return $couleur_extraite["$img-$x-$y"]=$couleur_extraite["$fichier-$x-$y"]; 353 ecrire_fichier($dest, $couleur_extraite["$fichier-$x-$y"]); 354 } else { 355 lire_fichier($dest, $couleur_extraite["$fichier-$x-$y"]); 356 } 357 358 return $couleur_extraite["$img-$x-$y"] = $couleur_extraite["$fichier-$x-$y"]; 291 359 } 292 360 … … 298 366 // et j'ai ajoute la ponderation par la distance au pixel) 299 367 function _image_distance_pixel($xo, $yo, $x0, $y0) { 300 $vx = $xo - $x0; 301 $vy = $yo - $y0; 302 $d = 1 - (sqrt(($vx)*($vx) + ($vy)*($vy)) / sqrt(2)); 368 $vx = $xo-$x0; 369 $vy = $yo-$y0; 370 $d = 1-(sqrt(($vx)*($vx)+($vy)*($vy))/sqrt(2)); 371 303 372 return $d; 304 373 } … … 314 383 */ 315 384 function _image_decale_composante($coul, $gamma) { 316 $coul = $coul + $gamma; 317 318 if ($coul > 255) $coul = 255; 319 if ($coul < 0) $coul = 0; 385 $coul = $coul+$gamma; 386 387 if ($coul > 255) { 388 $coul = 255; 389 } 390 if ($coul < 0) { 391 $coul = 0; 392 } 393 320 394 return $coul; 321 395 } … … 324 398 * Decalage d'une composante de couleur en sepia 325 399 * entier de 0 a 255 326 * 400 * 327 401 * @param int $coul 328 402 * @param int $val … … 330 404 */ 331 405 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; 334 else $y= $coul; 335 336 if ($y < 0) $y = 0; 337 if ($y > 255) $y = 255; 406 if ($coul < 127) { 407 $y = round((($coul-127)/127)*$val)+$val; 408 } else { 409 if ($coul >= 127) { 410 $y = round((($coul-127)/128)*(255-$val))+$val; 411 } else { 412 $y = $coul; 413 } 414 } 415 416 if ($y < 0) { 417 $y = 0; 418 } 419 if ($y > 255) { 420 $y = 255; 421 } 422 338 423 return $y; 339 424 }
Note: See TracChangeset
for help on using the changeset viewer.