243 lines
		
	
	
		
			No EOL
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			No EOL
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/** This file is part of KCFinder project
 | 
						|
  *
 | 
						|
  *      @desc Abstract image driver class
 | 
						|
  *   @package KCFinder
 | 
						|
  *   @version 3.12
 | 
						|
  *    @author Pavel Tzonkov <sunhater@sunhater.com>
 | 
						|
  * @copyright 2010-2014 KCFinder Project
 | 
						|
  *   @license http://opensource.org/licenses/GPL-3.0 GPLv3
 | 
						|
  *   @license http://opensource.org/licenses/LGPL-3.0 LGPLv3
 | 
						|
  *      @link http://kcfinder.sunhater.com
 | 
						|
  */
 | 
						|
 | 
						|
namespace kcfinder;
 | 
						|
 | 
						|
abstract class image {
 | 
						|
    const DEFAULT_JPEG_QUALITY = 75;
 | 
						|
 | 
						|
/** Image resource or object
 | 
						|
  * @var mixed */
 | 
						|
    protected $image;
 | 
						|
 | 
						|
/** Image width in pixels
 | 
						|
  * @var integer */
 | 
						|
    protected $width;
 | 
						|
 | 
						|
/** Image height in pixels
 | 
						|
  * @var integer */
 | 
						|
    protected $height;
 | 
						|
 | 
						|
/** Init error
 | 
						|
  * @var bool */
 | 
						|
    protected $initError = false;
 | 
						|
 | 
						|
/** Driver specific options
 | 
						|
  * @var array */
 | 
						|
    protected $options = array();
 | 
						|
 | 
						|
 | 
						|
/** Magic method which allows read-only access to all protected or private
 | 
						|
  * class properties
 | 
						|
  * @param string $property
 | 
						|
  * @return mixed */
 | 
						|
 | 
						|
    final public function __get($property) {
 | 
						|
        return property_exists($this, $property) ? $this->$property : null;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Constructor. Parameter $image should be:
 | 
						|
  *   1. An instance of image driver class (copy instance).
 | 
						|
  *   2. An image represented by the type of the $image property
 | 
						|
  *      (resource or object).
 | 
						|
  *   3. An array with two elements. First - width, second - height.
 | 
						|
  *      Creates a blank image.
 | 
						|
  *   4. A filename string. Get image form file.
 | 
						|
  * Second paramaeter is used by pass some specific image driver options
 | 
						|
  * @param mixed $image
 | 
						|
  * @param array $options */
 | 
						|
 | 
						|
    public function __construct($image, array $options=array()) {
 | 
						|
        $this->image = $this->width = $this->height = null;
 | 
						|
        $imageDetails = $this->buildImage($image);
 | 
						|
 | 
						|
        if ($imageDetails !== false)
 | 
						|
            list($this->image, $this->width, $this->height) = $imageDetails;
 | 
						|
        else
 | 
						|
            $this->initError = true;
 | 
						|
        $this->options = $options;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Factory pattern to load selected driver. $image and $options are passed
 | 
						|
  * to the constructor of the image driver
 | 
						|
  * @param string $driver
 | 
						|
  * @param mixed $image
 | 
						|
  * @return object */
 | 
						|
 | 
						|
    final static function factory($driver, $image, array $options=array()) {
 | 
						|
        $class = __NAMESPACE__ . "\\image_$driver";
 | 
						|
        return new $class($image, $options);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Checks if the drivers in the array parameter could be used. Returns first
 | 
						|
  * found one
 | 
						|
  * @param array $drivers
 | 
						|
  * @return string */
 | 
						|
 | 
						|
    final static function getDriver(array $drivers=array('gd')) {
 | 
						|
        foreach ($drivers as $driver) {
 | 
						|
            if (!preg_match('/^[a-z0-9\_]+$/i', $driver))
 | 
						|
                continue;
 | 
						|
            $class = __NAMESPACE__ . "\\image_$driver";
 | 
						|
            if (class_exists($class) && method_exists($class, "available")) {
 | 
						|
                eval("\$avail = $class::available();");
 | 
						|
                if ($avail) return $driver;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Returns an array. Element 0 - image resource. Element 1 - width. Element 2 - height.
 | 
						|
  * Returns FALSE on failure.
 | 
						|
  * @param mixed $image
 | 
						|
  * @return array */
 | 
						|
 | 
						|
    final protected function buildImage($image) {
 | 
						|
        $class = get_class($this);
 | 
						|
 | 
						|
        if ($image instanceof $class) {
 | 
						|
            $width = $image->width;
 | 
						|
            $height = $image->height;
 | 
						|
            $img = $image->image;
 | 
						|
 | 
						|
        } elseif (is_array($image)) {
 | 
						|
            list($key, $width) = each($image);
 | 
						|
            list($key, $height) = each($image);
 | 
						|
            $img = $this->getBlankImage($width, $height);
 | 
						|
 | 
						|
        } else
 | 
						|
            $img = $this->getImage($image, $width, $height);
 | 
						|
 | 
						|
        return ($img !== false)
 | 
						|
            ? array($img, $width, $height)
 | 
						|
            : false;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Returns calculated proportional width from the given height
 | 
						|
  * @param integer $resizedHeight
 | 
						|
  * @return integer */
 | 
						|
 | 
						|
    final public function getPropWidth($resizedHeight) {
 | 
						|
        $width = round(($this->width * $resizedHeight) / $this->height);
 | 
						|
        if (!$width) $width = 1;
 | 
						|
        return $width;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Returns calculated proportional height from the given width
 | 
						|
  * @param integer $resizedWidth
 | 
						|
  * @return integer */
 | 
						|
 | 
						|
    final public function getPropHeight($resizedWidth) {
 | 
						|
        $height = round(($this->height * $resizedWidth) / $this->width);
 | 
						|
        if (!$height) $height = 1;
 | 
						|
        return $height;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/** Checks if PHP needs some extra extensions to use the image driver. This
 | 
						|
  * static method should be implemented into driver classes like abstract
 | 
						|
  * methods
 | 
						|
  * @return bool */
 | 
						|
    static function available() { return false; }
 | 
						|
 | 
						|
/** Checks if file is an image. This static method should be implemented into
 | 
						|
  * driver classes like abstract methods
 | 
						|
  * @param string $file
 | 
						|
  * @return bool */
 | 
						|
    static function checkImage($file) { return false; }
 | 
						|
 | 
						|
/** Resize image. Should return TRUE on success or FALSE on failure
 | 
						|
  * @param integer $width
 | 
						|
  * @param integer $height
 | 
						|
  * @return bool */
 | 
						|
    abstract public function resize($width, $height);
 | 
						|
 | 
						|
/** Resize image to fit in given resolution. Should returns TRUE on success
 | 
						|
  * or FALSE on failure. If $background is set, the image size will be
 | 
						|
  * $width x $height and the empty spaces (if any) will be filled with defined
 | 
						|
  * color. Background color examples: "#5f5", "#ff67ca", array(255, 255, 255)
 | 
						|
  * @param integer $width
 | 
						|
  * @param integer $height
 | 
						|
  * @param mixed $background
 | 
						|
  * @return bool */
 | 
						|
    abstract public function resizeFit($width, $height, $background=false);
 | 
						|
 | 
						|
/** Resize and crop the image to fit in given resolution. Returns TRUE on
 | 
						|
  * success or FALSE on failure
 | 
						|
  * @param mixed $src
 | 
						|
  * @param integer $offset
 | 
						|
  * @return bool */
 | 
						|
    abstract public function resizeCrop($width, $height, $offset=false);
 | 
						|
 | 
						|
 | 
						|
/** Rotate image
 | 
						|
  * @param integer $angle
 | 
						|
  * @param string $background
 | 
						|
  * @return bool */
 | 
						|
    abstract public function rotate($angle, $background="#000000");
 | 
						|
 | 
						|
    abstract public function flipHorizontal();
 | 
						|
 | 
						|
    abstract public function flipVertical();
 | 
						|
 | 
						|
/** Apply a PNG or GIF watermark to the image. $top and $left parameters sets
 | 
						|
  * the offset of the watermark in pixels. Boolean and NULL values are possible
 | 
						|
  * too. In default case (FALSE, FALSE) the watermark should be applyed to
 | 
						|
  * the bottom right corner. NULL values means center aligning. If the
 | 
						|
  * watermark is bigger than the image or it's partialy or fully outside the
 | 
						|
  * image, it shoudn't be applied
 | 
						|
  * @param string $file
 | 
						|
  * @param mixed $top
 | 
						|
  * @param mixed $left
 | 
						|
  * @return bool */
 | 
						|
    abstract public function watermark($file, $left=false, $top=false);
 | 
						|
 | 
						|
/** Should output the image. Second parameter is used to pass some options like
 | 
						|
  *   'file' - if is set, the output will be written to a file
 | 
						|
  *   'quality' - compression quality
 | 
						|
  * It's possible to use extra specific options required by image type ($type)
 | 
						|
  * @param string $type
 | 
						|
  * @param array $options
 | 
						|
  * @return bool */
 | 
						|
    abstract public function output($type='jpeg', array $options=array());
 | 
						|
 | 
						|
/** This method should create a blank image with selected size. Should returns
 | 
						|
  * resource or object related to the created image, which will be passed to
 | 
						|
  * $image property
 | 
						|
  * @param integer $width
 | 
						|
  * @param integer $height
 | 
						|
  * @return mixed */
 | 
						|
    abstract protected function getBlankImage($width, $height);
 | 
						|
 | 
						|
/** This method should create an image from source image. Only first parameter
 | 
						|
  * ($image) is input. Its type should be filename string or a type of the
 | 
						|
  * $image property. See the constructor reference for details. The
 | 
						|
  * parametters $width and $height are output only. Should returns resource or
 | 
						|
  * object related to the created image, which will be passed to $image
 | 
						|
  * property
 | 
						|
  * @param mixed $image
 | 
						|
  * @param integer $width
 | 
						|
  * @param integer $height
 | 
						|
  * @return mixed */
 | 
						|
    abstract protected function getImage($image, &$width, &$height);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
?>
 |