PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/_core_/tags/spip-2.1.11/plugins/filtres_images/filtres/images_lib.php

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