PageRenderTime 25ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/html/inc/classes/Image.php

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