imgToolbox.class.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:29k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3.  * $Id: imgToolbox.class.php 480 2006-11-01 01:14:51Z beat $
  4. -----------------------------------------------------------------------
  5. |                                                                     |
  6. | Date: March, 2005       |
  7. | Author: MamboJoe, <http://www.mambojoe.com>                         |
  8. | Original Author: Mike de Boer, <http://www.mikedeboer.nl>           |
  9. | Copyright: copyright (C) 2004 by Mike de Boer                       |
  10. | Description: Abstracted Image Class               |
  11. | License: GPL                                                        |
  12. | Filename: imgToolbox.class.php                                      |
  13. | Version: 3.0                                                        |
  14. |                                                                     |
  15. -----------------------------------------------------------------------
  16. -----------------------------------------------------------------------
  17. |                                                                     |
  18. | What is the toolbox? --> well, it's an object that bundles all      |
  19. | medium-manipulation tools into one convenient class.                |
  20. | These tools would include:                                          |
  21. |                                                                     |
  22. | - Image resizing                                                    |
  23. | - Image rotating                                                    |
  24. | - Image watermarking with custom TrueType fonts                     |
  25. | - ALL tools have implementations for the following manipulation     |
  26. |   software: ImageMagick, NetPBM, GD1.x and GD2.x.                   |
  27. |                                                                     |
  28. -----------------------------------------------------------------------
  29. **/
  30. // ensure this file is being included by a parent file
  31. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  32. class imgToolbox{
  33. var $_platform = null;
  34. var $_isBackend = null;
  35. var $_conversiontype = null;
  36. var $_IM_path = null;
  37. var $_NETPBM_path = null;
  38. var $_JPEGquality = null;
  39. var $_err_num = null;
  40.      var $_err_names = array();
  41.      var $_err_types = array();
  42. var $_wmtext = null;
  43. var $_wmdatfmt = null;
  44. var $_wmfont = null;
  45. var $_wmfont_size = null;
  46. var $_wmrgbtext = null;
  47. var $_wmrgbtsdw = null;
  48. var $_wmhotspot = null;
  49. var $_wmtxp = null;
  50. var $_wmtyp = null;
  51. var $_wmsxp = null;
  52. var $_wmsyp = null;
  53.      var $_buffer = null;
  54. var $_filepath= null;
  55. var $_rotate = null;
  56. var $_maxsize = null;
  57. var $_maxwidth = null;
  58. var $_maxheight = null;
  59. var $_thumbwidth = null;
  60. var $_thumbheight = null;
  61. var $_errMSG = null;
  62. var $_debug = null;
  63. function imgToolBox(){
  64. // constructor of the toolbox - primary init...
  65. $this->_conversiontype=1;
  66. $this->_rotate=0;
  67. $this->_IM_path = "auto";
  68. $this->_NETPBM_path = "auto";
  69. $this->_maxsize = 102400;
  70. $this->_maxwidth = 200;
  71. $this->_maxheight = 500;
  72. $this->_thumbwidth = 86;
  73. $this->_thumbheight = 60;
  74. $this->_JPEGquality = 85;
  75. // load watermark settings...
  76. $this->_wmtext = "[date]";
  77. $this->_wmfont = "ARIAL.TTF";
  78. $this->_wmfont_size = 12;
  79. $this->_wmrgbtext = "FFFFFF";
  80. $this->_wmrgbtsdw = "000000";
  81. $this->_wmhotspot = 8;
  82. $this->_wmdatfmt = "Y-m-d";
  83. // watermark offset coordinates...t = top and s = side.
  84. $this->_wmtxp = 0;
  85. $this->_wmtyp = 0;
  86. $this->_wmsxp = 1;
  87. $this->_wmsyp = 1;
  88. // toolbox ready for use...
  89. }
  90.     function processImage($image, $filename,$filepath, $rotate, $degrees = 0, $copyMethod = 1, $allwaysResize = 1){
  91. // reset script execution time limit (as set in MAX_EXECUTION_TIME ini directive)...
  92. // requires SAFE MODE to be OFF!
  93. $this->_filepath=$filepath;
  94. if( ( !($this->cbIsFunctionDisabled( 'set_time_limit' ) ) ) && ( ini_get( 'safe_mode' ) != 1 ) ) { //CB_FIXED
  95. @set_time_limit(0);
  96. }
  97. $error=0;
  98. $errorMSG=null;
  99. switch ($this->_conversiontype){
  100. //Imagemagick
  101. case 1:
  102. if($this->_IM_path == 'auto'){
  103. $this->_IM_path = $this->autodetectExec( 'convert' );
  104. }else{
  105. if($this->_IM_path){
  106. if(!is_dir($this->_IM_path)){
  107. $error=1;
  108. $errorMSG = "Error: your ImageMagick path is not correct! Please (re)specify it in the Admin-system under 'Settings'";
  109. }
  110. }
  111. }
  112. break;
  113. //NetPBM
  114. case 2:
  115. if($this->_NETPBM_path == 'auto'){
  116. $this->_NETPBM_path = $this->autodetectExec( 'jpegtopnm' );
  117. }else{
  118. if($this->_NETPBM_path){
  119. if(!is_dir($this->_NETPBM_path)){
  120. $error=1;
  121. $errorMSG = "Error: your NetPBM path is not correct! Please (re)specify it in the Admin-system under 'Settings'";
  122. }
  123. }
  124. }
  125. break;
  126. //GD1
  127. case 3:
  128. if (!function_exists('imagecreatefromjpeg')) {
  129.     $error=1;
  130.     $errorMSG = "PHP running on your server does not support the GD image library, check with your webhost if ImageMagick is installed";
  131. }
  132. break;
  133. //GD2
  134. case 4:
  135. if (!function_exists('imagecreatefromjpeg')) {
  136.     $error=1;
  137.     $errorMSG = "Error: PHP running on your server does not support the GD image library, check with your webhost if ImageMagick is installed";
  138. }
  139. if (!function_exists('imagecreatetruecolor')) {
  140.     $error=1;
  141.     $errorMSG = "Error: PHP running on your server does not support GD graphics library version 2.x, please install GD version 2.x or switch to another images library in Community Builder Configuration.";
  142. }
  143. break;
  144. }
  145. if($error) {
  146. $this->raiseError($errorMSG);
  147.                      return false;
  148. }
  149. if(!$this->checkFilesize($image['tmp_name'],$this->_maxsize*1024)) {
  150. $this->raiseError("The file exceeds the maximum size of ".$this->_maxsize." kilobytes");
  151.                      return false;
  152. }
  153. $filepath = $this->_filepath;  
  154. $filename = urldecode($filename);
  155.      // replace every space-character with a single "_"
  156.      $filename = preg_replace( "/ /", "_",  $filename );
  157.   // Get rid of extra underscores
  158.   $filename = preg_replace( "/_+/", "_",  $filename );
  159.   $filename = preg_replace( "/(^_|_$)/", "", $filename );
  160. $tag = preg_replace( "/^.*\.([^\.]*)$/", "\1", $image['name'] );
  161. $tag = strtolower( $tag );
  162. $filename = $filename . "." . $tag;
  163. $image = $image['tmp_name'];
  164.         if ( $this->acceptableFormat( $tag ) ) {
  165.             // File is an image/ movie/ document...
  166.             $file = $this->_filepath . $filename;
  167.             $thumbfile = $this->_filepath . "tn" . $filename;
  168.             if ( $copyMethod == 1 ) {
  169.                 if ( ! @move_uploaded_file( $image, $file ) ) {
  170.                     // some error occured while moving file, register this...
  171. $this->raiseError("Error occurred during the moving of the uploaded file.");
  172.                     return false;
  173.                 }
  174.             } elseif ( $copyMethod == 2 ) {
  175.                 //disabled: if ( ! @fs_copy( $image, $file ) ){
  176.                     // some error occured while moving file, register this...
  177.                     $this->raiseError("Error occurred during the moving of the uploaded file.");
  178.                     return false;
  179.                 //}
  180.             }
  181.             @chmod( $file, 0644 );
  182.             if( $this->isImage( $tag ) ){
  183.                $imginfo = getimagesize( $file );
  184.                if ( $imginfo !== false ) {
  185.                if( $this->_rotate ){
  186.                    if( ! $this->rotateImage( $file, $file, $filename, $degrees ) ) {
  187.                            @unlink( $file );
  188.                        $this->raiseError("Error rotating image");
  189.                        return false;
  190.                    }
  191.                }
  192.                // if the image size is greater than the given maximum: resize it!               
  193.                if ( $imginfo[0] > $this->_maxwidth || $imginfo[1] > $this->_maxheight ){
  194.                 if( ! $this->resizeImage( $file, $file, $this->_maxwidth, $this->_maxheight, $filename ) ) {
  195.                    @unlink( $file );
  196.                    $this->raiseError( "Error: resizing image failed." );
  197.                    return false;
  198.                 }
  199.                } elseif ( $allwaysResize ) {
  200.                 if( ! $this->resizeImage( $file, $file, $imginfo[0], $imginfo[1], $filename ) ) {
  201.                    @unlink( $file );
  202.                    $this->raiseError( "Error: resizing image failed." );
  203.                    return false;
  204.                 }
  205.                }
  206.                // resize to thumbnail...
  207.              if( ! $this->resizeImage( $file, $thumbfile, $this->_thumbwidth, $this->_thumbheight, $filename ) ) {
  208.                    @unlink( $file );
  209.                    $this->raiseError("Error: resizing thumbnail image failed.");
  210.                    return false;
  211.                }
  212.                @chmod( $thumbfile, 0644 );
  213.                } else {
  214.                    @unlink( $file );
  215.                    $this->raiseError( "Error: image format is not supported." );
  216.           return false;
  217.                }
  218.            }
  219.         } else {
  220.             //Not the right format, register this...
  221.             $this->raiseError( "Error: " . $tag . " is not a supported format." );
  222.             return false;
  223.         }
  224.         return $filename;
  225.     }
  226. function acceptableFormat($tag){
  227. return ($this->isImage($tag));
  228. }
  229. function isImage($tag){
  230.     return in_array($tag, $this->acceptableImageList());
  231. }
  232. function acceptableImageList(){
  233.     return array('jpg', 'jpeg', 'gif', 'png');
  234. }
  235. function resizeImage($file, $desfile, $maxWidth, $maxHeight, $filename = ""){
  236. list($width, $height) = @getimagesize($file);
  237. if( $width > $maxWidth & $height <= $maxHeight )
  238. {
  239. $ratio = $maxWidth / $width;
  240. }
  241. elseif( $height > $maxHeight & $width <= $maxWidth )
  242. {
  243. $ratio = $maxHeight / $height;
  244. }
  245. elseif( $width > $maxWidth & $height > $maxHeight )
  246. {
  247. $ratio1 = $maxWidth / $width;
  248. $ratio2 = $maxHeight / $height;
  249. $ratio = ($ratio1 < $ratio2)? $ratio1:$ratio2;
  250. }
  251. else
  252. {
  253. $ratio = 1;
  254. }
  255. $nWidth = floor($width*$ratio);
  256. $nHeight = floor($height*$ratio);
  257. switch ($this->_conversiontype){
  258. //Imagemagick
  259. case 1:
  260. if($this->resizeImageIM($file, $desfile, $nWidth,$nHeight))
  261. return true;
  262. else
  263. return false;
  264. break;
  265. //NetPBM
  266. case 2:
  267. if($this->resizeImageNETPBM($file,$desfile,$nWidth,$nHeight,$filename))
  268. return true;
  269. else
  270. return false;
  271. break;
  272. //GD1
  273. case 3:
  274. if($this->resizeImageGD1($file, $desfile, $nWidth,$nHeight))
  275. return true;
  276. else
  277. return false;
  278. break;
  279. //GD2
  280. case 4:
  281. if($this->resizeImageGD2($file, $desfile, $nWidth,$nHeight))
  282. return true;
  283. else
  284. return false;
  285. break;
  286. }
  287. return true;
  288. }
  289. function resizeImageIM($src_file, $dest_file, $destWidth,$destHeight){
  290. //$cmd = $this->_IM_path."convert -resize $new_size "$src_file" "$dest_file"";
  291.     //$cmd = "'".$this->_IM_path."convert' -geometry $destWidth x $destHeight '$src_file' '$dest_file'"; 
  292.     $cmd = escapeshellcmd( $this->_IM_path . 'convert' ) . ' -geometry ' . escapeshellarg( $destWidth ) . ' x ' . escapeshellarg( $destHeight ) . ' ' . escapeshellarg( $src_file ) . ' ' . escapeshellarg( $dest_file ); 
  293. $output=array(); $retval = null;
  294. exec($cmd, $output, $retval);
  295. if($this->debug()) {
  296. echo "<div>cmd=$cmd<br/>output=". join("n", $output)."</div>";
  297. }
  298. return true;
  299. }
  300. function resizeImageNETPBM($src_file,$des_file,$destWidth,$destHeight,$orig_name){
  301. $quality = $this->_JPEGquality;
  302. $imginfo = getimagesize($src_file);
  303. if ($imginfo == null) {
  304. $this->raiseError("Error: Unable to execute getimagesize function");
  305. return false;
  306. }
  307. if (preg_match("/\.png$/i", $orig_name)){
  308. $cmd = escapeshellcmd( $this->_NETPBM_path . 'pngtopnm' )  . ' ' . escapeshellarg( $src_file ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'pnmscale' ) . ' -xysize ' . escapeshellarg( $destWidth ) . ' ' . escapeshellarg( $destHeight ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'pnmtopng' ) . ' > ' . escapeshellarg( $des_file ); 
  309. }
  310. else if (preg_match("/\.(jpg|jpeg)$/i", $orig_name)){
  311. $cmd = escapeshellcmd( $this->_NETPBM_path . 'jpegtopnm' ) . ' ' . escapeshellarg( $src_file ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'pnmscale' ) . ' -xysize ' . escapeshellarg( $destWidth ) . ' ' . escapeshellarg( $destHeight ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmtojpeg' ) . ' ' . escapeshellarg( "-quality=$quality" ) . ' > ' . escapeshellarg( $des_file );
  312. }
  313. else if (preg_match("/\.gif$/i", $orig_name)){
  314. $cmd = escapeshellcmd( $this->_NETPBM_path . 'giftopnm' )  . ' ' . escapeshellarg( $src_file ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'pnmscale' ) . ' -xysize ' . escapeshellarg( $destWidth ) . ' ' . escapeshellarg( $destHeight ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmquant' ) . ' 256 | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmtogif' ) . ' > ' . escapeshellarg( $des_file );
  315. }else{
  316. $this->raiseError("Error: NetPBM doesn't support this file type.");
  317. return false;
  318. }
  319. $output = array();
  320. $retval = null;
  321. exec($cmd, $output, $retval);
  322. if($this->debug()) {
  323. echo "<div>cmd=$cmd<br/>output=". join("n", $output)."</div>";
  324. }
  325. return true;
  326. }
  327. function resizeImageGD1($src_file, $dest_file, $destWidth,$destHeight){
  328. $imginfo = getimagesize($src_file);
  329. if ($imginfo == null) {
  330. $this->raiseError("Error: Unable to execute getimagesize function");
  331. return false;
  332. }
  333. // GD can only handle JPG & PNG images
  334. if ($imginfo[2] != 2 && $imginfo[2] != 3 && ($imginfo[2] == 1 && !function_exists( 'imagecreatefromgif' ))){
  335. $this->raiseError("Error: GD1 doesn't support this file type.");
  336. return false;
  337. }
  338. if ($imginfo[2] == 2)
  339. $src_img = imagecreatefromjpeg($src_file);
  340. elseif ($imginfo[2] == 1)
  341. $src_img = imagecreatefromgif($src_file);
  342. else
  343. $src_img = imagecreatefrompng($src_file);
  344. if (!$src_img) {
  345. $this->raiseError("Error: GD1 Unable to create image from imagetype function");
  346. return false;
  347. }
  348. $dst_img = imagecreate($destWidth, $destHeight);
  349. imagecopyresized($dst_img, $src_img, 0, 0, 0, 0, $destWidth, $destHeight, $imginfo[0], $imginfo[1]);
  350. if ($imginfo[2] == 2)
  351. imagejpeg($dst_img, $dest_file, $this->_JPEGquality);
  352. elseif ($imginfo[2] == 1)
  353. imagegif($dst_img, $dest_file);
  354. else
  355. imagepng($dst_img, $dest_file);
  356. imagedestroy($src_img);
  357. imagedestroy($dst_img);
  358. return true; 
  359. }
  360. function resizeImageGD2($src_file, $dest_file, $destWidth,$destHeight){
  361. $imginfo = getimagesize($src_file);
  362. if ($imginfo == null) {
  363. $this->raiseError("Error: Unable to execute getimagesize function");
  364. return false;
  365. }
  366. // GD can only handle JPG & PNG images
  367. if ($imginfo[2] != 2 && $imginfo[2] != 3 && ($imginfo[2] == 1 && !function_exists( 'imagecreatefromgif' ))){
  368. $this->raiseError("Error: GD2 Unable to create image from imagetype function");
  369. return false;
  370. }
  371. if ($imginfo[2] == 2)
  372. $src_img = imagecreatefromjpeg($src_file);
  373. elseif ($imginfo[2] == 1)
  374. $src_img = imagecreatefromgif($src_file);
  375. else
  376. $src_img = imagecreatefrompng($src_file);
  377. if (!$src_img) {
  378. $this->raiseError("Error: GD2 Unable to create image from imagetype function");
  379. return false;
  380. }
  381. $dst_img = imagecreatetruecolor($destWidth, $destHeight);
  382. $background_color = imagecolorallocate( $dst_img, 255, 255, 255 ); // white background for images with transparency
  383. ImageFilledRectangle($dst_img, 0, 0, $destWidth, $destHeight, $background_color);
  384. imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $destWidth, $destHeight, $imginfo[0], $imginfo[1]);
  385. if ($imginfo[2] == 2) {
  386. imagejpeg($dst_img, $dest_file, $this->_JPEGquality);
  387. } elseif ($imginfo[2] == 1) {
  388. if(function_exists('imagegif')) {
  389. imagegif($dst_img, $dest_file);
  390. } else {
  391. $this->raiseError("Error: GIF Uploads are not supported by this version of GD");
  392. return false;
  393. }
  394. } else {
  395. imagepng($dst_img, $dest_file);
  396. }
  397. imagedestroy($src_img);
  398. imagedestroy($dst_img);
  399. return true;
  400. }
  401. function rotateImage($file, $desfile, $filename, $degrees){
  402. $degrees = intval($degrees);
  403. switch ($this->_conversiontype){
  404. //Imagemagick
  405. case 1:
  406. if($this->rotateImageIM($file, $desfile, $degrees))
  407. return true;
  408. else
  409. return false;
  410. break;
  411. //NetPBM
  412. case 2:
  413. if($this->rotateImageNETPBM($file,$desfile, $filename, $degrees))
  414. return true;
  415. else
  416. return false;
  417. break;
  418. //GD1
  419. case 3:
  420. if($this->rotateImageGD1($file, $desfile, $degrees))
  421. return true;
  422. else
  423. return false;
  424. break;
  425. //GD2
  426. case 4:
  427. if($this->rotateImageGD2($file, $desfile, $degrees))
  428. return true;
  429. else
  430. return false;
  431. break;
  432. }
  433. return true;
  434. }
  435. function checkFilesize($file,$maxSize) {
  436.    $size = filesize($file);
  437.    if($size <= $maxSize) {
  438.       return true;
  439.    }
  440.    return false;
  441. }
  442. function rotateImageIM($file, $desfile, $degrees){
  443. $cmd = escapeshellcmd( $this->_IM_path . 'convert' ) . ' -rotate ' . escapeshellarg( $degrees ) . ' ' . escapeshellarg( $file ) . ' ' . escapeshellarg( $desfile );
  444. $retval = null;
  445. $output = null;
  446. exec($cmd, $output, $retval);
  447. if($retval)
  448. return false;
  449. else
  450. return true;
  451. }
  452. function rotateImageNETPBM($file, $desfile, $filename, $degrees){
  453. $quality = $this->_JPEGquality;
  454. $fileOut = "$file.1";
  455. fs_copy($file,$fileOut); 
  456. if (preg_match("/\.png$/i", $filename)){
  457. $cmd = escapeshellcmd( $this->_NETPBM_path . 'pngtopnm' )  . ' ' . escapeshellarg( $file ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'pnmrotate' ) . ' ' . escapeshellarg( $degrees ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmtopng' )  . ' > ' . escapeshellarg( $fileOut ); 
  458. }
  459. else if (preg_match("/\.(jpg|jpeg)$/i", $filename)){
  460. $cmd = escapeshellcmd( $this->_NETPBM_path . 'jpegtopnm' ) . ' ' . escapeshellarg( $file ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . "pnmrotate" ) . ' ' . escapeshellarg( $degrees ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmtojpeg' ) . ' ' . escapeshellarg( '-quality=' . $quality ). ' > ' . escapeshellarg( $fileOut );
  461. }
  462. else if (preg_match("/\.gif$/i", $filename)){
  463. $cmd = escapeshellcmd( $this->_NETPBM_path . 'giftopnm' )  . ' ' . escapeshellarg( $file ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . "pnmrotate" ) . ' ' . escapeshellarg( $degrees ) . ' | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmquant' )  . ' 256 | ' . escapeshellcmd( $this->_NETPBM_path . 'ppmtogif' ) . ' > ' . escapeshellarg( $fileOut ); 
  464. }else{
  465. return false;
  466. }
  467. $output = null;
  468. $retval = null;
  469. exec($cmd, $output, $retval);
  470. if($retval){
  471. return false;
  472. }else{
  473. fs_rename($fileOut, $desfile); 
  474. return true;
  475. }
  476. }
  477. function rotateImageGD1($file, $desfile, $degrees){
  478. $imginfo = getimagesize($file);
  479. if ($imginfo == null)
  480. return false;
  481. // GD can only handle JPG & PNG images
  482. if ($imginfo[2] != 2 && $imginfo[2] != 3){
  483. return false;
  484. }
  485. if ($imginfo[2] == 2)
  486. $src_img = imagecreatefromjpeg($file);
  487. else
  488. $src_img = imagecreatefrompng($file);
  489. if (!$src_img)
  490. return false;
  491. // The rotation routine...
  492. $src_img = imagerotate($src_img, $degrees, 0);
  493. $dst_img = imagecreate($imginfo[0], $imginfo[1]);
  494. $destWidth  = $imginfo[0];
  495. $destHeight = $imginfo[1];
  496. imagecopyresized($dst_img, $src_img, 0, 0, 0, 0, (int) $destWidth, (int) $destHeight, imagesx( $src_img ), imagesy( $src_img ) );
  497. if ($imginfo[2] == 2)
  498. imagejpeg($dst_img, $desfile, $this->_JPEGquality);
  499. else
  500. imagepng($dst_img, $desfile);
  501. imagedestroy($src_img);
  502. imagedestroy($dst_img);
  503. return true; 
  504. }
  505. function rotateImageGD2($file, $desfile, $degrees){
  506. $imginfo = getimagesize($file);
  507. if ($imginfo == null)
  508. return false;
  509. // GD can only handle JPG & PNG images
  510. if ($imginfo[2] != 2 && $imginfo[2] != 3){
  511. return false;
  512. }
  513. if ($imginfo[2] == 2)
  514. $src_img = imagecreatefromjpeg($file);
  515. else
  516. $src_img = imagecreatefrompng($file);
  517. if (!$src_img)
  518. return false;
  519. // The rotation routine...
  520. $src_img = imagerotate($src_img, $degrees, 0);
  521. $dst_img = imagecreatetruecolor($imginfo[0], $imginfo[1]);
  522. $destWidth  = $imginfo[0];
  523. $destHeight = $imginfo[1];
  524. imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, (int) $destWidth, (int) $destHeight, imagesx( $src_img ), imagesy( $src_img ) );
  525. if ($imginfo[2] == 2)
  526. imagejpeg($dst_img, $desfile, $this->_JPEGquality);
  527. else
  528. imagepng($dst_img, $desfile);
  529. imagedestroy($src_img);
  530. imagedestroy($dst_img);
  531. return true;
  532. }
  533. // watermark by Elf Qrin ( http://www.ElfQrin.com/ ) - modified for use with zOOm.
  534. function watermark($file, $desfile) {
  535. $suffx = substr($file,strlen($file)-4,4);
  536. if ($suffx == ".jpg" || $suffx == "jpeg" || $suffx == ".png") {
  537. $text = str_replace("[date]",date($this->_wmdatfmt),$this->_wmtext);
  538. if ($suffx == ".jpg" || $suffx == "jpeg") {
  539. $image = imagecreatefromjpeg($file);
  540. }
  541. if ($suffx == ".png") {
  542. $image = imagecreatefrompng($file);
  543. }
  544. $rgbtext = HexDec($this->_wmrgbtext);
  545. $txtr = floor($rgbtext/pow(256,2));
  546. $txtg = floor(($rgbtext%pow(256,2))/pow(256,1));
  547. $txtb = floor((($rgbtext%pow(256,2))%pow(256,1))/pow(256,0));
  548. $rgbtsdw = HexDec($this->_wmrgbtsdw);
  549. $tsdr = floor($rgbtsdw/pow(256,2));
  550. $tsdg = floor(($rgbtsdw%pow(256,2))/pow(256,1));
  551. $tsdb = floor((($rgbtsdw%pow(256,2))%pow(256,1))/pow(256,0));
  552. $coltext = imagecolorallocate($image,$txtr,$txtg,$txtb);
  553. $coltsdw = imagecolorallocate($image,$tsdr,$tsdg,$tsdb);
  554. if ($this->_wmhotspot != 0) {
  555. $ix = imagesx($image);
  556. $iy = imagesy($image);
  557. $tsw = strlen($text)*$this->_wmfont_size/imagefontwidth($this->_wmfont)*3;
  558. $tsh = $this->_wmfont_size/imagefontheight($this->_wmfont);
  559. switch ($this->_wmhotspot) {
  560. case 1:
  561. $txp = $this->_wmtxp;
  562. $typ = $tsh*$tsh+imagefontheight($this->_wmfont)*2+$this->_wmtyp;
  563. break;
  564. case 2:
  565. $txp = floor(($ix-$tsw)/2);
  566. $typ = $tsh*$tsh+imagefontheight($this->_wmfont)*2+$this->_wmtyp;
  567. break;
  568. case 3:
  569. $txp = $ix-$tsw-$txp;
  570. $typ = $tsh*$tsh+imagefontheight($this->_wmfont)*2+$this->_wmtyp;
  571. break;
  572. case 4:
  573. $txp = $this->_wmtxp;
  574. $typ = floor(($iy-$tsh)/2);
  575. break;
  576. case 5:
  577. $txp = floor(($ix-$tsw)/2);
  578. $typ = floor(($iy-$tsh)/2);
  579. break;
  580. case 6:
  581. $txp = $ix-$tsw-$this->_wmtxp;
  582. $typ = floor(($iy-$tsh)/2);
  583. break;
  584. case 7:
  585. $txp = $this->_wmtxp;
  586. $typ = $iy-$tsh-$this->_wmtyp;
  587. break;
  588. case 8:
  589. $txp = floor(($ix-$tsw)/2);
  590. $typ = $iy-$tsh-$this->_wmtyp;
  591. break;
  592. case 9:
  593. $txp = $ix-$tsw-$this->_wmtxp;
  594. $typ = $iy-$tsh-$this->_wmtyp;
  595. break;
  596. }
  597. }
  598. imagettftext($image, $this->_wmfont_size, 0, $txp + 1, $typ + 1, $coltsdw, $this->_wmfont,$text);
  599. imagettftext($image, $this->_wmfont_size, 0, $txp, $typ, $coltext, $this->_wmfont, $text);
  600. if ($suffx == ".jpg" || $suffx == "jpeg") {
  601. imagejpeg($image, $desfile, $this->_JPEGquality);
  602. }elseif($suffx == ".png"){
  603. imgepng($image, $desfile);
  604. }
  605. imagedestroy($image);
  606. return true;
  607. }else{
  608. return false;
  609. }
  610. }
  611. /**
  612. * Copy and resample an image with rounded corners.
  613. * source:  public code, license: public
  614. * ----------------------------------------------------------- */
  615. function imageRoundedCopyResampled(&$dstimg, &$srcimg, $dstx, $dsty, $srcx, $srcy, $dstw, $dsth, $srcw, $srch, $radius) {
  616. # Resize the Source Image
  617. $srcResized = imagecreatetruecolor($dstw, $dsth);
  618. imagecopyresampled($srcResized, $srcimg, 0, 0, $srcx, $srcy,
  619. $dstw, $dsth, $srcw, $srch);
  620. # Copy the Body without corners
  621. imagecopy($dstimg, $srcResized, $dstx+$radius, $dsty,
  622. $radius, 0, $dstw-($radius*2), $dsth);
  623. imagecopy($dstimg, $srcResized, $dstx, $dsty+$radius,
  624. 0, $radius, $dstw, $dsth-($radius*2));
  625. # Create a list of iterations; array(array(X1, X2, CenterX, CenterY), ...)
  626. # Iterations in order are: Top-Left, Top-Right, Bottom-Left, Bottom-Right
  627. $iterations = array(
  628. array(0, 0, $radius, $radius),
  629. array($dstw-$radius, 0, $dstw-$radius, $radius),
  630. array(0, $dsth-$radius, $radius, $dsth-$radius),
  631. array($dstw-$radius, $dsth-$radius, $dstw-$radius, $dsth-$radius)
  632. );
  633. # Loop through each corner 'iteration'
  634. foreach($iterations as $iteration) {
  635. list($x1,$y1,$cx,$cy) = $iteration;
  636. for ($y=$y1; $y<=$y1+$radius; $y++) {
  637. for ($x=$x1; $x<=$x1+$radius; $x++) {
  638. # If length (X,Y)->(CX,CY) is less then radius draw the point
  639. $length = sqrt(pow(($cx - $x), 2) + pow(($cy - $y), 2));
  640. if ($length < $radius) {
  641. imagecopy($dstimg, $srcResized, $x+$dstx, $y+$dsty,
  642. $x, $y, 1, 1);
  643. }
  644. }
  645. }
  646. }
  647. }
  648. function parseDir($dir){
  649. global $zoom;
  650. // start the scan...(open the local dir)
  651. $images = array();
  652. $handle = fs_opendir($dir);
  653. while (($file = readdir($handle)) != false) {
  654. if ($file != "." && $file != "..") {
  655. $tag = preg_replace("/.*\.([^\.]*)$/", "\1", $file);
  656. $tag = strtolower($tag);
  657. if ($zoom->acceptableFormat($tag)) {
  658. // Tack it onto images...
  659. $images[] = $file;
  660. }
  661. }
  662. }
  663. closedir($handle);
  664. return $images;
  665. }
  666. function getImageLibs(){
  667. // do auto-detection on the available graphics libraries
  668. // This assumes the executables are within the shell's path
  669. $imageLibs= array();
  670. // do various tests:
  671. if ( true == ( $testIM = $this->testIM() ) ) {
  672. $imageLibs['imagemagick'] = $testIM;
  673. }
  674. if (true == ( $testNetPBM = $this->testNetPBM() ) ) {
  675. $imageLibs['netpbm'] = $testNetPBM;
  676. }
  677. $imageLibs['gd'] = $this->testGD();
  678. return $imageLibs;
  679. }
  680. //CB_FIXES:
  681. function cbIsFunctionDisabled( $function ) {
  682. if (is_callable("ini_get")) {
  683. $funcsString = @ini_get( 'disable_functions' );
  684. if ( extension_loaded( 'suhosin' ) ) {
  685. $funcsString .= ',' . @ini_get( 'suhosin.executor.func.blacklist' );
  686. }
  687. $funcs = explode( ',', $funcsString );
  688. for ( $i=0, $n=count($funcs); $i<$n; $i++ ) {
  689. $funcs[$i] = trim($funcs[$i]);
  690. }
  691. return in_array( $function, $funcs );
  692. } else {
  693. return true;
  694. }
  695. }
  696. function cbIsExecDisabled() {
  697. return $this->cbIsFunctionDisabled( 'exec' );
  698. }
  699. //END OF CB_FIXES.
  700. function testIM(){
  701. if($this->cbIsExecDisabled()){ //CB_FIXES:
  702. return false;     // exec() is disabled, so give up
  703. }
  704. if ( $this->_IM_path == 'auto' ) {
  705. $this->_IM_path = $this->autodetectExec( 'convert' );
  706. }
  707. $output = null;
  708. $status = null;
  709. $matches = null;
  710. @exec( escapeshellcmd( $this->_IM_path . 'convert' ) . ' -version', $output, $status );
  711. if(!$status){
  712. if(preg_match("/imagemagick[ t]+([0-9\.]+)/i",$output[0],$matches))
  713.    return $matches[0];
  714. }
  715. unset($output, $status);
  716. return null;
  717. }
  718. function testNetPBM(){
  719. if($this->cbIsExecDisabled()){ //CB_FIXES:
  720. return false;     // exec() is disabled, so give up
  721. }
  722. if($this->_NETPBM_path == 'auto'){
  723. $this->_NETPBM_path = $this->autodetectExec( 'jpegtopnm' );
  724. }
  725. $output = null;
  726. $status = null;
  727. $matches = null;
  728. @exec( escapeshellcmd( $this->_NETPBM_path . 'jpegtopnm' ) . ' -version 2>&1',  $output, $status );
  729. if(!$status){
  730. if(preg_match("/netpbm[ t]+([0-9\.]+)/i",$output[0],$matches))
  731.    return $matches[0];
  732. }
  733. unset($output, $status);
  734. return null;
  735. }
  736. function testGD(){
  737. $gd = array();
  738. // $GDfuncList = get_extension_funcs('gd');
  739. ob_start();
  740. @phpinfo(INFO_MODULES);
  741. $output=ob_get_contents();
  742. ob_end_clean();
  743. $matches[1]='';
  744. if(preg_match("/GD Version[ t]*(<[^>]+>[ t]*)+([^<>]+)/s",$output,$matches)){
  745. $gdversion = $matches[2];
  746. if (function_exists('imagecreatetruecolor') && function_exists('imagecreatefromjpeg')) {
  747. $gd['gd2'] = $gdversion;
  748. } elseif (function_exists('imagecreatefromjpeg')) {
  749. $gd['gd1'] = $gdversion;
  750. }
  751. }
  752. /*
  753. */
  754. return $gd;
  755. }
  756. function autodetectExec( $program ) {
  757. $path = null;
  758. if( function_exists( 'is_executable' ) ) {
  759. $paths = array( '/usr/bin/', '/usr/local/bin/', '' );
  760. foreach ($paths as $path) {
  761. if ( @is_executable( $path . $program ) ) {
  762. $found = true;
  763. break;
  764. }
  765. }
  766. }
  767. return $path;
  768. }
  769. function strip_nulls( $str ){
  770. $res = explode( chr(0), $str );
  771. return chop( $res[0] );
  772. }
  773. //--------------------Error handling functions-------------------------//
  774. function debug() {
  775. if($this->_debug) return true;
  776. else return false;
  777. }
  778. function raiseError($errorMSG) {
  779. $this->_errMSG=$errorMSG;
  780. return true;
  781. }
  782. function displayErrors(){
  783. if ($this->_err_num <> 0){
  784. echo '<center><table border="0" cellpadding="3" cellspacing="0" width="70%">';
  785. echo '<tr class="sectiontableheader"><td width="100" align="left">Image Name</td><td align="left">Error type</td></tr>';
  786. $tabcnt = 0;
  787. for ($x = 0; $x <= $this->_err_num; $x++){
  788. echo '<tr align="left"><td>'.$this->_err_names[$x].'</td><td align="left">'.$this->_err_types[$x].'</td></tr>';
  789. if ($tabcnt == 1){
  790.      $tabcnt = 0;
  791. } else {
  792. $tabcnt++;
  793.      }
  794. }
  795. echo "</table></center>";
  796. }
  797. }
  798. //--------------------END error handling functions----------------------//
  799. }