** Filename......: NetPBM.php ** Last changed..: 30 Aug 2003 ** Notes.........: Orginal is from PEAR **/ // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2002 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Peter Bowyer | // +----------------------------------------------------------------------+ // // $Id: NetPBM.php,v 1.2.2.1 2006/01/01 23:28:23 gustafn Exp $ // // Image Transformation interface using command line NetPBM require_once "Transform.php"; Class Image_Transform_Driver_NetPBM extends Image_Transform { /** * associative array commands to be executed * @var array */ var $command = array(); /** * Class Constructor */ function Image_Transform_Driver_NetPBM() { $this->uid = md5($_SERVER['REMOTE_ADDR']); return true; } // End function Image_NetPBM /** * Load image * * @param string filename * * @return mixed none or a PEAR error object on error * @see PEAR::isError() */ function load($image) { //echo $image; $this->image = $image; $this->_get_image_details($image); } // End load /** * Resizes the image * * @return none * @see PEAR::isError() */ function _resize($new_x, $new_y) { // there's no technical reason why resize can't be called multiple // times...it's just silly to do so $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmscale -width $new_x -height $new_y"; $this->_set_new_x($new_x); $this->_set_new_y($new_y); } // End resize /** * Crop the image * * @param int $crop_x left column of the image * @param int $crop_y top row of the image * @param int $crop_width new cropped image width * @param int $crop_height new cropped image height */ function crop($crop_x, $crop_y, $crop_width, $crop_height) { $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmcut -left $crop_x -top $crop_y -width $crop_width -height $crop_height"; } /** * Rotates the image * * @param int $angle The angle to rotate the image through */ function rotate($angle) { $angle = -1*floatval($angle); if($angle > 90) { $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmrotate -noantialias 90"; $this->rotate(-1*($angle-90)); } else if ($angle < -90) { $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmrotate -noantialias -90"; $this->rotate(-1*($angle+90)); } else $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmrotate -noantialias $angle"; } // End rotate /** * Flip the image horizontally or vertically * * @param boolean $horizontal true if horizontal flip, vertical otherwise */ function flip($horizontal) { if($horizontal) $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmflip -lr"; else $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmflip -tb"; } /** * Adjust the image gamma * * @param float $outputgamma * * @return none */ function gamma($outputgamma = 1.0) { $this->command[13] = IMAGE_TRANSFORM_LIB_PATH . "pnmgamma $outputgamma"; } /** * adds text to an image * * @param array options Array contains options * array( * 'text' // The string to draw * 'x' // Horizontal position * 'y' // Vertical Position * 'Color' // Font color * 'font' // Font to be used * 'size' // Size of the fonts in pixel * 'resize_first' // Tell if the image has to be resized * // before drawing the text * ) * * @return none */ function addText($params) { $default_params = array('text' => 'This is Text', 'x' => 10, 'y' => 20, 'color' => 'red', 'font' => 'Arial.ttf', 'size' => '12', 'angle' => 0, 'resize_first' => false); // we ignore 'resize_first' since the more logical approach would be // for the user to just call $this->_resize() _first_ ;) extract(array_merge($default_params, $params)); $this->command[] = "ppmlabel -angle $angle -colour $color -size " ."$size -x $x -y ".$y+$size." -text \"$text\""; } // End addText function _postProcess($type, $quality, $save_type) { $type = is_null($type) || $type==''? $this->type : $type; $save_type = is_null($save_type) || $save_type==''? $this->type : $save_type; //echo "TYPE:". $this->type; array_unshift($this->command, IMAGE_TRANSFORM_LIB_PATH . $type.'topnm '. $this->image); $arg = ''; switch(strtolower($save_type)){ case 'gif': $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "ppmquant 256"; $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "ppmto$save_type"; break; case 'jpg': case 'jpeg': $arg = "--quality=$quality"; $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "ppmto$save_type $arg"; break; default: $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmto$save_type $arg"; break; } // switch return implode('|', $this->command); } /** * Save the image file * * @param $filename string the name of the file to write to * @param string $type (jpeg,png...); * @param int $quality 75 * @return none */ function save($filename, $type=null, $quality = 85) { $cmd = $this->_postProcess('', $quality, $type) . ">$filename"; //if we have windows server if(isset($_ENV['OS']) && eregi('window',$_ENV['OS'])) $cmd = ereg_replace('/','\\',$cmd); //echo $cmd."##"; $output = system($cmd); error_log('NETPBM: '.$cmd); //error_log($output); $this->command = array(); } // End save /** * Display image without saving and lose changes * * @param string $type (jpeg,png...); * @param int $quality 75 * @return none */ function display($type = null, $quality = 75) { header('Content-type: image/' . $type); $cmd = $this->_postProcess($type, $quality); passthru($cmd); $this->command = array(); } /** * Destroy image handle * * @return none */ function free() { // there is no image handle here return true; } } // End class NetPBM ?>