TAS-ALFA/admin-zone/ckeditor/kcfinder/lib/class_image_imagick.php

307 lines
8.4 KiB
PHP

<?php
/** This file is part of KCFinder project
*
* @desc ImageMagick 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;
class image_imagick extends image {
static $MIMES = array(
//'tif' => "image/tiff"
);
// ABSTRACT PUBLIC METHODS
public function resize($width, $height) {//
if (!$width) $width = 1;
if (!$height) $height = 1;
try {
$this->image->scaleImage($width, $height);
} catch (\Exception $e) {
return false;
}
$this->width = $width;
$this->height = $height;
return true;
}
public function resizeFit($width, $height, $background=false) {//
if (!$width) $width = 1;
if (!$height) $height = 1;
try {
$this->image->scaleImage($width, $height, true);
$size = $this->image->getImageGeometry();
} catch (\Exception $e) {
return false;
}
if ($background === false) {
$this->width = $size['width'];
$this->height = $size['height'];
return true;
} else {
try {
$this->image->setImageBackgroundColor($background);
$x = -round(($width - $size['width']) / 2);
$y = -round(($height - $size['height']) / 2);
$this->image->extentImage($width, $height, $x, $y);
} catch (\Exception $e) {
return false;
}
$this->width = $width;
$this->height = $height;
return true;
}
}
public function resizeCrop($width, $height, $offset=false) {
if (!$width) $width = 1;
if (!$height) $height = 1;
if (($this->width / $this->height) > ($width / $height)) {
$h = $height;
$w = ($this->width * $h) / $this->height;
$y = 0;
if ($offset !== false) {
if ($offset > 0)
$offset = -$offset;
if (($w + $offset) <= $width)
$offset = $width - $w;
$x = $offset;
} else
$x = ($width - $w) / 2;
} else {
$w = $width;
$h = ($this->height * $w) / $this->width;
$x = 0;
if ($offset !== false) {
if ($offset > 0)
$offset = -$offset;
if (($h + $offset) <= $height)
$offset = $height - $h;
$y = $offset;
} else
$y = ($height - $h) / 2;
}
$x = round($x);
$y = round($y);
$w = round($w);
$h = round($h);
if (!$w) $w = 1;
if (!$h) $h = 1;
try {
$this->image->scaleImage($w, $h);
$this->image->cropImage($width, $height, -$x, -$y);
} catch (\Exception $e) {
return false;
}
$this->width = $width;
$this->height = $height;
return true;
}
public function rotate($angle, $background="#000000") {
try {
$this->image->rotateImage(new \ImagickPixel($background), $angle);
$size = $this->image->getImageGeometry();
} catch (\Exception $e) {
return false;
}
$this->width = $size['width'];
$this->height = $size['height'];
return true;
}
public function flipHorizontal() {
try {
$this->image->flopImage();
} catch (\Exception $e) {
return false;
}
return true;
}
public function flipVertical() {
try {
$this->image->flipImage();
} catch (\Exception $e) {
return false;
}
return true;
}
public function watermark($file, $left=false, $top=false) {
try {
$wm = new \Imagick($file);
$size = $wm->getImageGeometry();
} catch (\Exception $e) {
return false;
}
$w = $size['width'];
$h = $size['height'];
$x =
($left === true) ? 0 : (
($left === null) ? round(($this->width - $w) / 2) : (
(($left === false) || !preg_match('/^\d+$/', $left)) ? ($this->width - $w) : $left));
$y =
($top === true) ? 0 : (
($top === null) ? round(($this->height - $h) / 2) : (
(($top === false) || !preg_match('/^\d+$/', $top)) ? ($this->height - $h) : $top));
if ((($x + $w) > $this->width) ||
(($y + $h) > $this->height) ||
($x < 0) || ($y < 0)
)
return false;
try {
$this->image->compositeImage($wm, \Imagick::COMPOSITE_DEFAULT, $x, $y);
} catch (\Exception $e) {
return false;
}
return true;
}
// ABSTRACT PROTECTED METHODS
protected function getBlankImage($width, $height) {
try {
$img = new \Imagick();
$img->newImage($width, $height, "none");
$img->setImageCompressionQuality(100);
} catch (\Exception $e) {
return false;
}
return $img;
}
protected function getImage($image, &$width, &$height) {
if (is_object($image) && ($image instanceof image_imagick)) {
try {
$image->image->setImageCompressionQuality(100);
} catch (\Exception $e) {
return false;
}
$width = $image->width;
$height = $image->height;
return $image->image;
} elseif (is_object($image) && ($image instanceof \Imagick)) {
try {
$image->setImageCompressionQuality(100);
$size = $image->getImageGeometry();
} catch (\Exception $e) {
return false;
}
$width = $size['width'];
$height = $size['height'];
return $image;
} elseif (is_string($image)) {
try {
$image = new \Imagick($image);
$image->setImageCompressionQuality(100);
$size = $image->getImageGeometry();
} catch (\Exception $e) {
return false;
}
$width = $size['width'];
$height = $size['height'];
return $image;
} else
return false;
}
// PSEUDO-ABSTRACT STATIC METHODS
static function available() {
return class_exists("\\Imagick");
}
static function checkImage($file) {
try {
$img = new \Imagick($file);
} catch (\Exception $e) {
return false;
}
return true;
}
// INHERIT METHODS
public function output($type="jpeg", array $options=array()) {
$type = strtolower($type);
try {
$this->image->setImageFormat($type);
} catch (\Exception $e) {
return false;
}
$method = "optimize_$type";
if (method_exists($this, $method) && !$this->$method($options))
return false;
if (!isset($options['file'])) {
if (!headers_sent()) {
$mime = isset(self::$MIMES[$type]) ? self::$MIMES[$type] : "image/$type";
header("Content-Type: $mime");
}
echo $this->image;
} else {
$file = $options['file'] . ".$type";
try {
$this->image->writeImage($file);
} catch (\Exception $e) {
@unlink($file);
return false;
}
if (!@rename($file, $options['file'])) {
@unlink($file);
return false;
}
}
return true;
}
// OWN METHODS
protected function optimize_jpeg(array $options=array()) {
$quality = isset($options['quality']) ? $options['quality'] : self::DEFAULT_JPEG_QUALITY;
try {
$this->image->setImageCompression(\Imagick::COMPRESSION_JPEG);
$this->image->setImageCompressionQuality($quality);
} catch (\Exception $e) {
return false;
}
return true;
}
}
?>