1
0

Image.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. <?php
  2. /* $Id: Image.php 2273 2007-01-20 00:55:36Z b4rt $ */
  3. /*******************************************************************************
  4. LICENSE
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License (GPL)
  7. as published by the Free Software Foundation; either version 2
  8. of the License, or (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. To read the license please visit http://www.gnu.org/copyleft/gpl.html
  14. *******************************************************************************/
  15. // image-types
  16. if (!defined("IMG_GIF")) define("IMG_GIF", 1);
  17. if (!defined("IMG_JPG")) define("IMG_JPG", 2);
  18. if (!defined("IMG_PNG")) define("IMG_PNG", 4);
  19. // =============================================================================
  20. // Image-class
  21. // =============================================================================
  22. /**
  23. * Image
  24. */
  25. class Image
  26. {
  27. // public fields
  28. // type
  29. var $type = 0;
  30. // dim
  31. var $width = 0;
  32. var $height = 0;
  33. // image
  34. var $image;
  35. // private fields
  36. // content-types
  37. var $_contentTypes = array(
  38. IMG_GIF => 'image/gif',
  39. IMG_JPG => 'image/png',
  40. IMG_PNG => 'image/jpeg');
  41. // imagetypes
  42. var $_imagetypes = 0;
  43. // =========================================================================
  44. // public static methods
  45. // =========================================================================
  46. /* factories */
  47. /**
  48. * getImage
  49. *
  50. * @param $t
  51. * @param $w
  52. * @param $h
  53. */
  54. function getImage($t = IMG_GIF, $w = 0, $h = 0) {
  55. $img = new Image($t, $w, $h);
  56. if (!$img)
  57. return false;
  58. $img->image = @imagecreate($w, $h);
  59. return (!$img->image)
  60. ? false
  61. : $img;
  62. }
  63. /**
  64. * getImageFromRessource
  65. *
  66. * @param $t
  67. * @param $r
  68. */
  69. function getImageFromRessource($t = IMG_GIF, $r) {
  70. $img = new Image($t);
  71. if (!$img)
  72. return false;
  73. switch ($t) {
  74. case IMG_GIF:
  75. $img->image = @imagecreatefromgif($r);
  76. return (!$img->image)
  77. ? false
  78. : $img;
  79. case IMG_PNG:
  80. $img->image = @imagecreatefromjpeg($r);
  81. return (!$img->image)
  82. ? false
  83. : $img;
  84. break;
  85. case IMG_JPG:
  86. $img->image = @imagecreatefrompng($r);
  87. return (!$img->image)
  88. ? false
  89. : $img;
  90. break;
  91. }
  92. }
  93. /* generic static helper-meths */
  94. /**
  95. * check image support of PHP + GD
  96. *
  97. * @return boolean
  98. */
  99. function isSupported() {
  100. if (extension_loaded('gd')) {
  101. // gd is there but we also need support for at least one image-type
  102. $imageTypes = imagetypes();
  103. // gif
  104. if ($imageTypes & IMG_GIF)
  105. return true;
  106. // png
  107. if ($imageTypes & IMG_PNG)
  108. return true;
  109. // jpg
  110. if ($imageTypes & IMG_JPG)
  111. return true;
  112. }
  113. return false;
  114. }
  115. /**
  116. * check image-type support of PHP + GD
  117. *
  118. * @return boolean
  119. */
  120. function isTypeSupported($type) {
  121. return ((extension_loaded('gd')) && (imagetypes() & $type));
  122. }
  123. /**
  124. * check referer
  125. */
  126. function checkReferer() {
  127. if (!((isset($_SERVER["HTTP_REFERER"])) &&
  128. (stristr($_SERVER["HTTP_REFERER"], $_SERVER["SERVER_NAME"]) !== false)))
  129. Image::paintInvalidReferer();
  130. }
  131. /**
  132. * convert a string (#RRGGBB or RRGGBB) to a array with R-G-B as decimals
  133. *
  134. * @param string $color
  135. * @return array
  136. */
  137. function stringToRGBColor($color) {
  138. $retVal = array();
  139. $color = str_replace('#', '', $color);
  140. $retVal['r'] = hexdec(substr($color, 0, 2));
  141. $retVal['g'] = hexdec(substr($color, 2, 2));
  142. $retVal['b'] = hexdec(substr($color, 4, 2));
  143. return $retVal;
  144. }
  145. /* static paint-image-methods */
  146. /**
  147. * paint label-image created with a existing image-file
  148. *
  149. * @param $bgimage
  150. * @param $label
  151. * @param $font
  152. * @param $x
  153. * @param $y
  154. * @param $r
  155. * @param $g
  156. * @param $b
  157. */
  158. function paintLabelFromImage($bgimage, $label,
  159. $font = 1,
  160. $x = 0, $y = 0,
  161. $r = 0, $g = 0, $b = 0) {
  162. // img
  163. $imageObject = false;
  164. // gif
  165. $imageObject = Image::getImageFromRessource(IMG_GIF, $bgimage.".gif");
  166. // try png if failed
  167. if (!$imageObject)
  168. $imageObject = Image::getImageFromRessource(IMG_PNG, $bgimage.".png");
  169. // try jpg if failed
  170. if (!$imageObject)
  171. $imageObject = Image::getImageFromRessource(IMG_JPG, $bgimage.".jpg");
  172. // bail if no object
  173. if (!$imageObject)
  174. Image::paintNotSupported();
  175. // paint offscreen-image
  176. $textcolor = imagecolorallocate($imageObject->image, $r, $g, $b);
  177. imagestring($imageObject->image, $font, $x, $y, $label, $textcolor);
  178. // output
  179. $imageObject->paint();
  180. }
  181. /**
  182. * paint a 3d-pie
  183. *
  184. * @param int $w
  185. * @param int $h
  186. * @param int $cx
  187. * @param int $cy
  188. * @param int $sx
  189. * @param int $sy
  190. * @param int $sz
  191. * @param array $bg []
  192. * @param array $values []
  193. * @param array $colors [][]
  194. * @param array $legend []
  195. * @param int $legendX
  196. * @param int $legendY
  197. * @param int $legendFont
  198. * @param int $legendSpace
  199. */
  200. function paintPie3D(
  201. $w,
  202. $h,
  203. $cx,
  204. $cy,
  205. $sx,
  206. $sy,
  207. $sz,
  208. $bg,
  209. $values,
  210. $colors,
  211. $legend = false,
  212. $legendX = 0,
  213. $legendY = 0,
  214. $legendFont = 2,
  215. $legendSpace = 14) {
  216. // img
  217. $imageObject = false;
  218. // gif
  219. $imageObject = Image::getImage(IMG_GIF, $w, $h);
  220. // try png if failed
  221. if (!$imageObject)
  222. $imageObject = Image::getImage(IMG_PNG, $w, $h);
  223. // try jpg if failed
  224. if (!$imageObject)
  225. $imageObject = Image::getImage(IMG_JPG, $w, $h);
  226. // bail if no object
  227. if (!$imageObject)
  228. Image::paintNotSupported();
  229. // background
  230. $background = imagecolorallocate($imageObject->image, $bg['r'], $bg['g'], $bg['b']);
  231. // convert to angles.
  232. $valueCount = count($values);
  233. $valueSum = array_sum($values);
  234. for ($i = 0; $i < $valueCount; $i++) {
  235. $angle[$i] = (($values[$i] / $valueSum) * 360);
  236. $angle_sum[$i] = array_sum($angle);
  237. }
  238. // colors.
  239. for ($i = 0; $i < $valueCount; $i++) {
  240. $col_s[$i] = imagecolorallocate($imageObject->image, $colors[$i]['r'], $colors[$i]['g'], $colors[$i]['b']);
  241. $col_d[$i] = imagecolorallocate($imageObject->image, ($colors[$i]['r'] >> 1), ($colors[$i]['g'] >> 1), ($colors[$i]['b'] >> 1));
  242. }
  243. // 3D effect.
  244. for ($z = 1; $z <= $sz; $z++) {
  245. for ($i = 0; $i < $valueCount; $i++) {
  246. imagefilledarc($imageObject->image,
  247. $cx,
  248. ($cy + $sz) - $z,
  249. $sx,
  250. $sy,
  251. $angle_sum[($i != 0) ? $i - 1 : $valueCount - 1],
  252. $angle_sum[$i],
  253. $col_d[$i],
  254. IMG_ARC_PIE);
  255. }
  256. }
  257. // top pie.
  258. for ($i = 0; $i < $valueCount; $i++) {
  259. imagefilledarc($imageObject->image,
  260. $cx,
  261. $cy,
  262. $sx,
  263. $sy,
  264. $angle_sum[($i != 0) ? $i - 1 : $valueCount - 1],
  265. $angle_sum[$i],
  266. $col_s[$i],
  267. IMG_ARC_PIE);
  268. }
  269. // legend
  270. if ($legend) {
  271. $curY = $legendY;
  272. for ($i = 0; $i < $valueCount; $i++) {
  273. $textcolor = imagecolorallocate($imageObject->image, $colors[$i]['r'], $colors[$i]['g'], $colors[$i]['b']);
  274. imagestring($imageObject->image, $legendFont, $legendX, $curY, $legend[$i], $textcolor);
  275. $curY += $legendSpace;
  276. }
  277. }
  278. // output
  279. $imageObject->paint();
  280. }
  281. /* static paint-methods "drawing" inline-media */
  282. /**
  283. * output image not supported image
  284. */
  285. function paintNotSupported() {
  286. $d = "";
  287. $d .= 'R0lGODlhXAAkAIcAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  288. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  289. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  290. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  291. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  292. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  293. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  294. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  295. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  296. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  297. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  298. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  299. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  300. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  301. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  302. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  303. . 'AAAAAAAAAAAAAAAAACH5BAMAAAIALAAAAABcACQAAAj/AAUIHEiwoMGDCBMqXMiw'
  304. . 'ocAAAQ5CdEgQosWJFDNqxDjQokGODi+K1EiyIUgBFwueZHhyZcmXHSNW9DgzJk2J'
  305. . 'MiuizPkwokiOP3nuvBl05M6jMXsa/Xgzac2iSpcGjQoVKVCfQl0OJZoVq0qvT7si'
  306. . 'dUoW48SWQmemHNuT7VG0bs+Kran07dyFHuHqFbv3q9+kcv+yBAuYr2G/cOnaJNyW'
  307. . 'KWKeeSEHthmXcWWmMqfi/Lk4ZdWqW2milYy5M961neWiDp1WamvRad3CRDjZ8cbY'
  308. . 'WmfD1Jpbt2/fvGP/Hj47OPHjyJObXK28eUnOL6E7By78NvPp0auT7I2dInTX1xuz'
  309. . 'g8baVPp406kle/6+VHBR9vCNagYtvu9psmzNPt4fVqX7w/eJl19OU9lXWFOKGZjQ'
  310. . 'VYpZVaBh87VXH4AKMYhfbW3tpRlV//FXIYGkFabWgJYteNd5stk2YFgRxreeeZVx'
  311. .'9eF6DV4F3mqcbYifiTNGVqNwxnUnZI8IDmlkakcmqeSSSQYEADs=';
  312. Image::paintData('image/gif', base64_decode($d), 1190);
  313. }
  314. /**
  315. * output invalid referer image
  316. */
  317. function paintInvalidReferer() {
  318. $d = "";
  319. $d .= 'R0lGODlhEAAQAOZpAJJzRlFFOU4vKOjPNOzTNOvTMkowJ0k5MmU3J1k6OEo8NO3S'
  320. . 'KvDUM4VFKuLEMjciIe7WKz4iHVUxJNPAbUgwNKBTLY1HLPTbK/PaLezRMu3TMIVw'
  321. . 'X8K5q+bOM75nL6yJO0QtM+7RN8+ILm86KeXLLYduZaCpyuXZWOrMMt+1MsFqMWEy'
  322. . 'Ir/Ej4iEakM6RmxHNufiiO3PMdyqMdeZMOvSMqiusezPT3dEL7a2t+7gUKmFUHpK'
  323. . 'OT8pJmQ3KFoxJz8rKPXcLpJiUu7QMXhIObJkLujQMpWBU+rSM+rLMbTApfHjQtCH'
  324. . 'MWxWN+3VM5uPhkIrJuXGM+bIbEEqJ5SivsemMOrPL+W/LsO5nGlVQst5Mu3QMZ50'
  325. . 'MdWZLF44M+3TNdK8POK7M8CTMUssJ3tWN8/Qin5XR725ofDVNFk4KwAAAAAAAAAA'
  326. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  327. . 'AAAAAAAAAAAAAAAAACH5BAEAAGkALAAAAAAQABAAAAeSgGmCAAoHWIKIiYMAg0yK'
  328. . 'ik6KRo+IjIkBV5QtG4oTXzCUAYJRNiFAF0pmjwEvKlxWQmdeEGQcimgPFllgWgwE'
  329. . 'VTk1j08+HjJIMRoFCyw4ihI8FTMoGTRFJCdTijc/I0tQRwMdAxhJJolBAmJEKU0E'
  330. . 'DlQfOo89Ug0iYVtjCSARZYo7BCAY0oWCC0qCSqwwgLAhwkAAOw==';
  331. Image::paintData('image/gif', base64_decode($d), 565);
  332. }
  333. /**
  334. * output no-op image
  335. */
  336. function paintNoOp() {
  337. $d = "";
  338. $d .= 'R0lGODlhDQAMAOZeAP///44LDoYLDWMJC18XGKNmZ6cNEXQJDFsHCsUQFbwPFLkP'
  339. . 'FKQNEaENEZMMEIoLDokLD4cLD34KDXIJDHAJDG4JDGYIC7YPFJ0NEZoNEYILDncK'
  340. . 'DXMKDWcJDMgXHpAaHmwXGlokJsRpbK5maKxqbdmoqrkaIr4hLOHQ0cYkMc0sO7kp'
  341. . 'NswxQkoTGXYhKtuvtOvh4lAWHdE6TmgdJ4YtOeSxt784S8Y+UkQYH5o9TLxAVdNK'
  342. . 'YkgaIk0cJdy2vdZPaVQfKtZQal0jMMZPadhaecpYdtpggZhFXOW8x9tlh9ZjhHs6'
  343. . 'Tttpjd5vlYVJYYtTbrV2nplliLqAqqJzmZltkqh9pquEqpyrxp2tx196o6e3zr3J'
  344. . '28bQ393Q0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  345. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  346. . 'AAAAAAAAAAAAAAAAACH5BAEAAF4ALAAAAAANAAwAAAeHgF6CXlZVU1RRg4NSTUxJ'
  347. . 'REE7MkeDUEpFSEM7NjUrKTSCRpgAPjcvACUmCV5RPzo5AAAwsR8GF0JPMiwrLrMw'
  348. . 'IBgGDEJOKiknJLEABRgNGUBLHgoisSGxIxEQPV4LDA8oIAcEXQMTG4IuDQEUBxoW'
  349. . 'CBYVMYMzDhACEhwVHS2Kgj09eODAoSgQADs=';
  350. Image::paintData('image/gif', base64_decode($d), 554);
  351. }
  352. /**
  353. * output spacer image
  354. */
  355. function paintSpacer() {
  356. $d = "";
  357. $d .= 'R0lGODlhAQABAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  358. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  359. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  360. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  361. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  362. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  363. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  364. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  365. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  366. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  367. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  368. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  369. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  370. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  371. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  372. . 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  373. . 'AAAAAAAAAAAAAAAAACH5BAMAAAEALAAAAAABAAEAAAgEAAMEBAA7';
  374. Image::paintData('image/gif', base64_decode($d), 807);
  375. }
  376. /**
  377. * paint image-data
  378. *
  379. * @param $type
  380. * @param $data
  381. * @param $len
  382. */
  383. function paintData($type, $data, $len) {
  384. @header('Accept-Ranges: bytes');
  385. @header('Content-Length: '.$len);
  386. @header('Content-Type: '.$type);
  387. echo $data;
  388. exit();
  389. }
  390. // =========================================================================
  391. // ctor
  392. // =========================================================================
  393. /**
  394. * do not use direct, use the factory-methods !
  395. *
  396. * @return Image
  397. */
  398. function Image($t = IMG_GIF, $w = 0, $h = 0) {
  399. // GD required
  400. if (extension_loaded('gd')) {
  401. // types Supported
  402. $this->_imagetypes = imagetypes();
  403. // type
  404. if ($this->_imagetypes & $t)
  405. $this->type = $t;
  406. else
  407. return false;
  408. // dim
  409. $this->width = $w;
  410. $this->height = $h;
  411. } else {
  412. // return false
  413. return false;
  414. }
  415. }
  416. // =========================================================================
  417. // public methods
  418. // =========================================================================
  419. /**
  420. * paint
  421. */
  422. function paint() {
  423. @header("Content-type: ".$this->_contentTypes[$this->type]);
  424. switch ($this->type) {
  425. case IMG_GIF:
  426. imagegif($this->image);
  427. break;
  428. case IMG_PNG:
  429. imagepng($this->image);
  430. break;
  431. case IMG_JPG:
  432. imagejpeg($this->image);
  433. break;
  434. }
  435. imagedestroy($this->image);
  436. exit();
  437. }
  438. }
  439. ?>