forked from extern/egroupware
255 lines
8.0 KiB
PHP
255 lines
8.0 KiB
PHP
|
<?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$
|
||
|
//
|
||
|
// 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 you are using windows, you need the following line.
|
||
|
//$cmd = ereg_replace('/','\\',$cmd);
|
||
|
//echo $cmd."##";
|
||
|
system($cmd);
|
||
|
$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 ImageIM
|
||
|
?>
|