blob: 2e3f58f69eed972f182da15e28303ff0b3a5c9b7 [file] [log] [blame]
<?php
/***********************************************************************
** Title.........: NetPBM Driver
** Version.......: 1.0
** Author........: Xiang Wei ZHUO <wei@zhuo.org>
** 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 <peter@mapledesign.co.uk> |
// +----------------------------------------------------------------------+
//
// $Id:NetPBM.php 709 2007-01-30 23:22:04Z ray $
//
// Image Transformation interface using command line NetPBM
require_once "../ImageManager/Classes/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 string $filename 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
?>