diff options
Diffstat (limited to 'kohana/libraries/drivers/Image')
-rw-r--r-- | kohana/libraries/drivers/Image/GD.php | 401 | ||||
-rw-r--r-- | kohana/libraries/drivers/Image/GraphicsMagick.php | 221 | ||||
-rw-r--r-- | kohana/libraries/drivers/Image/ImageMagick.php | 222 |
3 files changed, 0 insertions, 844 deletions
diff --git a/kohana/libraries/drivers/Image/GD.php b/kohana/libraries/drivers/Image/GD.php deleted file mode 100644 index be2af4e2..00000000 --- a/kohana/libraries/drivers/Image/GD.php +++ /dev/null @@ -1,401 +0,0 @@ -<?php defined('SYSPATH') OR die('No direct access allowed.'); -/** - * GD Image Driver. - * - * $Id: GD.php 3769 2008-12-15 00:48:56Z zombor $ - * - * @package Image - * @author Kohana Team - * @copyright (c) 2007-2008 Kohana Team - * @license http://kohanaphp.com/license.html - */ -class Image_GD_Driver extends Image_Driver { - - // A transparent PNG as a string - protected static $blank_png; - protected static $blank_png_width; - protected static $blank_png_height; - - public function __construct() - { - // Make sure that GD2 is available - if ( ! function_exists('gd_info')) - throw new Kohana_Exception('image.gd.requires_v2'); - - // Get the GD information - $info = gd_info(); - - // Make sure that the GD2 is installed - if (strpos($info['GD Version'], '2.') === FALSE) - throw new Kohana_Exception('image.gd.requires_v2'); - } - - public function process($image, $actions, $dir, $file, $render = FALSE) - { - // Set the "create" function - switch ($image['type']) - { - case IMAGETYPE_JPEG: - $create = 'imagecreatefromjpeg'; - break; - case IMAGETYPE_GIF: - $create = 'imagecreatefromgif'; - break; - case IMAGETYPE_PNG: - $create = 'imagecreatefrompng'; - break; - } - - // Set the "save" function - switch (strtolower(substr(strrchr($file, '.'), 1))) - { - case 'jpg': - case 'jpeg': - $save = 'imagejpeg'; - break; - case 'gif': - $save = 'imagegif'; - break; - case 'png': - $save = 'imagepng'; - break; - } - - // Make sure the image type is supported for import - if (empty($create) OR ! function_exists($create)) - throw new Kohana_Exception('image.type_not_allowed', $image['file']); - - // Make sure the image type is supported for saving - if (empty($save) OR ! function_exists($save)) - throw new Kohana_Exception('image.type_not_allowed', $dir.$file); - - // Load the image - $this->image = $image; - - // Create the GD image resource - $this->tmp_image = $create($image['file']); - - // Get the quality setting from the actions - $quality = arr::remove('quality', $actions); - - if ($status = $this->execute($actions)) - { - // Prevent the alpha from being lost - imagealphablending($this->tmp_image, TRUE); - imagesavealpha($this->tmp_image, TRUE); - - switch ($save) - { - case 'imagejpeg': - // Default the quality to 95 - ($quality === NULL) and $quality = 95; - break; - case 'imagegif': - // Remove the quality setting, GIF doesn't use it - unset($quality); - break; - case 'imagepng': - // Always use a compression level of 9 for PNGs. This does not - // affect quality, it only increases the level of compression! - $quality = 9; - break; - } - - if ($render === FALSE) - { - // Set the status to the save return value, saving with the quality requested - $status = isset($quality) ? $save($this->tmp_image, $dir.$file, $quality) : $save($this->tmp_image, $dir.$file); - } - else - { - // Output the image directly to the browser - switch ($save) - { - case 'imagejpeg': - header('Content-Type: image/jpeg'); - break; - case 'imagegif': - header('Content-Type: image/gif'); - break; - case 'imagepng': - header('Content-Type: image/png'); - break; - } - - $status = isset($quality) ? $save($this->tmp_image, NULL, $quality) : $save($this->tmp_image); - } - - // Destroy the temporary image - imagedestroy($this->tmp_image); - } - - return $status; - } - - public function flip($direction) - { - // Get the current width and height - $width = imagesx($this->tmp_image); - $height = imagesy($this->tmp_image); - - // Create the flipped image - $flipped = $this->imagecreatetransparent($width, $height); - - if ($direction === Image::HORIZONTAL) - { - for ($x = 0; $x < $width; $x++) - { - $status = imagecopy($flipped, $this->tmp_image, $x, 0, $width - $x - 1, 0, 1, $height); - } - } - elseif ($direction === Image::VERTICAL) - { - for ($y = 0; $y < $height; $y++) - { - $status = imagecopy($flipped, $this->tmp_image, 0, $y, 0, $height - $y - 1, $width, 1); - } - } - else - { - // Do nothing - return TRUE; - } - - if ($status === TRUE) - { - // Swap the new image for the old one - imagedestroy($this->tmp_image); - $this->tmp_image = $flipped; - } - - return $status; - } - - public function crop($properties) - { - // Sanitize the cropping settings - $this->sanitize_geometry($properties); - - // Get the current width and height - $width = imagesx($this->tmp_image); - $height = imagesy($this->tmp_image); - - // Create the temporary image to copy to - $img = $this->imagecreatetransparent($properties['width'], $properties['height']); - - // Execute the crop - if ($status = imagecopyresampled($img, $this->tmp_image, 0, 0, $properties['left'], $properties['top'], $width, $height, $width, $height)) - { - // Swap the new image for the old one - imagedestroy($this->tmp_image); - $this->tmp_image = $img; - } - - return $status; - } - - public function resize($properties) - { - // Get the current width and height - $width = imagesx($this->tmp_image); - $height = imagesy($this->tmp_image); - - if (substr($properties['width'], -1) === '%') - { - // Recalculate the percentage to a pixel size - $properties['width'] = round($width * (substr($properties['width'], 0, -1) / 100)); - } - - if (substr($properties['height'], -1) === '%') - { - // Recalculate the percentage to a pixel size - $properties['height'] = round($height * (substr($properties['height'], 0, -1) / 100)); - } - - // Recalculate the width and height, if they are missing - empty($properties['width']) and $properties['width'] = round($width * $properties['height'] / $height); - empty($properties['height']) and $properties['height'] = round($height * $properties['width'] / $width); - - if ($properties['master'] === Image::AUTO) - { - // Change an automatic master dim to the correct type - $properties['master'] = (($width / $properties['width']) > ($height / $properties['height'])) ? Image::WIDTH : Image::HEIGHT; - } - - if (empty($properties['height']) OR $properties['master'] === Image::WIDTH) - { - // Recalculate the height based on the width - $properties['height'] = round($height * $properties['width'] / $width); - } - - if (empty($properties['width']) OR $properties['master'] === Image::HEIGHT) - { - // Recalculate the width based on the height - $properties['width'] = round($width * $properties['height'] / $height); - } - - // Test if we can do a resize without resampling to speed up the final resize - if ($properties['width'] > $width / 2 AND $properties['height'] > $height / 2) - { - // Presize width and height - $pre_width = $width; - $pre_height = $height; - - // The maximum reduction is 10% greater than the final size - $max_reduction_width = round($properties['width'] * 1.1); - $max_reduction_height = round($properties['height'] * 1.1); - - // Reduce the size using an O(2n) algorithm, until it reaches the maximum reduction - while ($pre_width / 2 > $max_reduction_width AND $pre_height / 2 > $max_reduction_height) - { - $pre_width /= 2; - $pre_height /= 2; - } - - // Create the temporary image to copy to - $img = $this->imagecreatetransparent($pre_width, $pre_height); - - if ($status = imagecopyresized($img, $this->tmp_image, 0, 0, 0, 0, $pre_width, $pre_height, $width, $height)) - { - // Swap the new image for the old one - imagedestroy($this->tmp_image); - $this->tmp_image = $img; - } - - // Set the width and height to the presize - $width = $pre_width; - $height = $pre_height; - } - - // Create the temporary image to copy to - $img = $this->imagecreatetransparent($properties['width'], $properties['height']); - - // Execute the resize - if ($status = imagecopyresampled($img, $this->tmp_image, 0, 0, 0, 0, $properties['width'], $properties['height'], $width, $height)) - { - // Swap the new image for the old one - imagedestroy($this->tmp_image); - $this->tmp_image = $img; - } - - return $status; - } - - public function rotate($amount) - { - // Use current image to rotate - $img = $this->tmp_image; - - // White, with an alpha of 0 - $transparent = imagecolorallocatealpha($img, 255, 255, 255, 127); - - // Rotate, setting the transparent color - $img = imagerotate($img, 360 - $amount, $transparent, -1); - - // Fill the background with the transparent "color" - imagecolortransparent($img, $transparent); - - // Merge the images - if ($status = imagecopymerge($this->tmp_image, $img, 0, 0, 0, 0, imagesx($this->tmp_image), imagesy($this->tmp_image), 100)) - { - // Prevent the alpha from being lost - imagealphablending($img, TRUE); - imagesavealpha($img, TRUE); - - // Swap the new image for the old one - imagedestroy($this->tmp_image); - $this->tmp_image = $img; - } - - return $status; - } - - public function sharpen($amount) - { - // Make sure that the sharpening function is available - if ( ! function_exists('imageconvolution')) - throw new Kohana_Exception('image.unsupported_method', __FUNCTION__); - - // Amount should be in the range of 18-10 - $amount = round(abs(-18 + ($amount * 0.08)), 2); - - // Gaussian blur matrix - $matrix = array - ( - array(-1, -1, -1), - array(-1, $amount, -1), - array(-1, -1, -1), - ); - - // Perform the sharpen - return imageconvolution($this->tmp_image, $matrix, $amount - 8, 0); - } - - public function composite($properties) - { - switch($properties['mime']) - { - case "image/jpeg": - $overlay_img = imagecreatefromjpeg($properties['overlay_file']); - break; - - case "image/gif": - $overlay_img = imagecreatefromgif($properties['overlay_file']); - break; - - case "image/png": - $overlay_img = imagecreatefrompng($properties['overlay_file']); - break; - } - - imagecopymerge($this->tmp_image, $overlay_img, $properties['x'], $properties['y'], 0, 0, imagesx($overlay_img), imagesy($overlay_img), $properties['transparency']); - imagedestroy($overlay_img); - return TRUE; - } - - protected function properties() - { - return array(imagesx($this->tmp_image), imagesy($this->tmp_image)); - } - - /** - * Returns an image with a transparent background. Used for rotating to - * prevent unfilled backgrounds. - * - * @param integer image width - * @param integer image height - * @return resource - */ - protected function imagecreatetransparent($width, $height) - { - if (self::$blank_png === NULL) - { - // Decode the blank PNG if it has not been done already - self::$blank_png = imagecreatefromstring(base64_decode - ( - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29'. - 'mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBN'. - 'CgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQ'. - 'AANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoH'. - 'AgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB'. - '3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII=' - )); - - // Set the blank PNG width and height - self::$blank_png_width = imagesx(self::$blank_png); - self::$blank_png_height = imagesy(self::$blank_png); - } - - $img = imagecreatetruecolor($width, $height); - - // Resize the blank image - imagecopyresized($img, self::$blank_png, 0, 0, 0, 0, $width, $height, self::$blank_png_width, self::$blank_png_height); - - // Prevent the alpha from being lost - imagealphablending($img, FALSE); - imagesavealpha($img, TRUE); - - return $img; - } - -} // End Image GD Driver
\ No newline at end of file diff --git a/kohana/libraries/drivers/Image/GraphicsMagick.php b/kohana/libraries/drivers/Image/GraphicsMagick.php deleted file mode 100644 index a8bc4d9b..00000000 --- a/kohana/libraries/drivers/Image/GraphicsMagick.php +++ /dev/null @@ -1,221 +0,0 @@ -<?php defined('SYSPATH') OR die('No direct access allowed.'); -/** - * GraphicsMagick Image Driver. - * - * @package Image - * @author Kohana Team - * @copyright (c) 2007-2008 Kohana Team - * @license http://kohanaphp.com/license.html - */ -class Image_GraphicsMagick_Driver extends Image_Driver { - - // Directory that GM is installed in - protected $dir = ''; - - // Command extension (exe for windows) - protected $ext = ''; - - // Temporary image filename - protected $tmp_image; - - /** - * Attempts to detect the GraphicsMagick installation directory. - * - * @throws Kohana_Exception - * @param array configuration - * @return void - */ - public function __construct($config) - { - if (empty($config['directory'])) - { - // Attempt to locate GM by using "which" (only works for *nix!) - if ( ! is_file($path = exec('which gm'))) - throw new Kohana_Exception('image.graphicsmagick.not_found'); - - $config['directory'] = dirname($path); - } - - // Set the command extension - $this->ext = (PHP_SHLIB_SUFFIX === 'dll') ? '.exe' : ''; - - // Check to make sure the provided path is correct - if ( ! is_file(realpath($config['directory']).'/gm'.$this->ext)) - throw new Kohana_Exception('image.graphicsmagick.not_found', 'gm'.$this->ext); - - - // Set the installation directory - $this->dir = str_replace('\\', '/', realpath($config['directory'])).'/'; - } - - /** - * Creates a temporary image and executes the given actions. By creating a - * temporary copy of the image before manipulating it, this process is atomic. - */ - public function process($image, $actions, $dir, $file, $render = FALSE) - { - // We only need the filename - $image = $image['file']; - - // Unique temporary filename - $this->tmp_image = $dir.'k2img--'.sha1(time().$dir.$file).substr($file, strrpos($file, '.')); - - // Copy the image to the temporary file - copy($image, $this->tmp_image); - - // Quality change is done last - $quality = (int) arr::remove('quality', $actions); - - // Use 95 for the default quality - empty($quality) and $quality = 95; - - // All calls to these will need to be escaped, so do it now - $this->cmd_image = escapeshellarg($this->tmp_image); - $this->new_image = ($render)? $this->cmd_image : escapeshellarg($dir.$file); - - if ($status = $this->execute($actions)) - { - // Use convert to change the image into its final version. This is - // done to allow the file type to change correctly, and to handle - // the quality conversion in the most effective way possible. - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -quality '.$quality.'% '.$this->cmd_image.' '.$this->new_image)) - { - $this->errors[] = $error; - } - else - { - // Output the image directly to the browser - if ($render !== FALSE) - { - $contents = file_get_contents($this->tmp_image); - switch (substr($file, strrpos($file, '.') + 1)) - { - case 'jpg': - case 'jpeg': - header('Content-Type: image/jpeg'); - break; - case 'gif': - header('Content-Type: image/gif'); - break; - case 'png': - header('Content-Type: image/png'); - break; - } - echo $contents; - } - } - } - - // Remove the temporary image - unlink($this->tmp_image); - $this->tmp_image = ''; - - return $status; - } - - public function crop($prop) - { - // Sanitize and normalize the properties into geometry - $this->sanitize_geometry($prop); - - // Set the IM geometry based on the properties - $geometry = escapeshellarg($prop['width'].'x'.$prop['height'].'+'.$prop['left'].'+'.$prop['top']); - - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -crop '.$geometry.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function flip($dir) - { - // Convert the direction into a GM command - $dir = ($dir === Image::HORIZONTAL) ? '-flop' : '-flip'; - - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' '.$dir.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function resize($prop) - { - switch ($prop['master']) - { - case Image::WIDTH: // Wx - $dim = escapeshellarg($prop['width'].'x'); - break; - case Image::HEIGHT: // xH - $dim = escapeshellarg('x'.$prop['height']); - break; - case Image::AUTO: // WxH - $dim = escapeshellarg($prop['width'].'x'.$prop['height']); - break; - case Image::NONE: // WxH! - $dim = escapeshellarg($prop['width'].'x'.$prop['height'].'!'); - break; - } - - // Use "convert" to change the width and height - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -resize '.$dim.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function rotate($amt) - { - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -rotate '.escapeshellarg($amt).' -background transparent '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function sharpen($amount) - { - // Set the sigma, radius, and amount. The amount formula allows a nice - // spread between 1 and 100 without pixelizing the image badly. - $sigma = 0.5; - $radius = $sigma * 2; - $amount = round(($amount / 80) * 3.14, 2); - - // Convert the amount to an GM command - $sharpen = escapeshellarg($radius.'x'.$sigma.'+'.$amount.'+0'); - - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' convert').' -unsharp '.$sharpen.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function composite($properties) - { - if ($error = exec(escapeshellcmd($this->dir.'gm'.$this->ext.' composite').' -geometry ' . escapeshellarg('+'.$properties['x'].'+'.$properties['y']).' -dissolve '.escapeshellarg($properties['transparency']).' '.escapeshellarg($properties['overlay_file']).' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - return TRUE; - } - - protected function properties() - { - return array_slice(getimagesize($this->tmp_image), 0, 2, FALSE); - } - -} // End Image GraphicsMagick Driver
\ No newline at end of file diff --git a/kohana/libraries/drivers/Image/ImageMagick.php b/kohana/libraries/drivers/Image/ImageMagick.php deleted file mode 100644 index 4b381fd6..00000000 --- a/kohana/libraries/drivers/Image/ImageMagick.php +++ /dev/null @@ -1,222 +0,0 @@ -<?php defined('SYSPATH') OR die('No direct access allowed.'); -/** - * ImageMagick Image Driver. - * - * $Id: ImageMagick.php 3769 2008-12-15 00:48:56Z zombor $ - * - * @package Image - * @author Kohana Team - * @copyright (c) 2007-2008 Kohana Team - * @license http://kohanaphp.com/license.html - */ -class Image_ImageMagick_Driver extends Image_Driver { - - // Directory that IM is installed in - protected $dir = ''; - - // Command extension (exe for windows) - protected $ext = ''; - - // Temporary image filename - protected $tmp_image; - - /** - * Attempts to detect the ImageMagick installation directory. - * - * @throws Kohana_Exception - * @param array configuration - * @return void - */ - public function __construct($config) - { - if (empty($config['directory'])) - { - // Attempt to locate IM by using "which" (only works for *nix!) - if ( ! is_file($path = exec('which convert'))) - throw new Kohana_Exception('image.imagemagick.not_found'); - - $config['directory'] = dirname($path); - } - - // Set the command extension - $this->ext = (PHP_SHLIB_SUFFIX === 'dll') ? '.exe' : ''; - - // Check to make sure the provided path is correct - if ( ! is_file(realpath($config['directory']).'/convert'.$this->ext)) - throw new Kohana_Exception('image.imagemagick.not_found', 'convert'.$this->ext); - - // Set the installation directory - $this->dir = str_replace('\\', '/', realpath($config['directory'])).'/'; - } - - /** - * Creates a temporary image and executes the given actions. By creating a - * temporary copy of the image before manipulating it, this process is atomic. - */ - public function process($image, $actions, $dir, $file, $render = FALSE) - { - // We only need the filename - $image = $image['file']; - - // Unique temporary filename - $this->tmp_image = $dir.'k2img--'.sha1(time().$dir.$file).substr($file, strrpos($file, '.')); - - // Copy the image to the temporary file - copy($image, $this->tmp_image); - - // Quality change is done last - $quality = (int) arr::remove('quality', $actions); - - // Use 95 for the default quality - empty($quality) and $quality = 95; - - // All calls to these will need to be escaped, so do it now - $this->cmd_image = escapeshellarg($this->tmp_image); - $this->new_image = ($render)? $this->cmd_image : escapeshellarg($dir.$file); - - if ($status = $this->execute($actions)) - { - // Use convert to change the image into its final version. This is - // done to allow the file type to change correctly, and to handle - // the quality conversion in the most effective way possible. - if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -quality '.$quality.'% '.$this->cmd_image.' '.$this->new_image)) - { - $this->errors[] = $error; - } - else - { - // Output the image directly to the browser - if ($render !== FALSE) - { - $contents = file_get_contents($this->tmp_image); - switch (substr($file, strrpos($file, '.') + 1)) - { - case 'jpg': - case 'jpeg': - header('Content-Type: image/jpeg'); - break; - case 'gif': - header('Content-Type: image/gif'); - break; - case 'png': - header('Content-Type: image/png'); - break; - } - echo $contents; - } - } - } - - // Remove the temporary image - unlink($this->tmp_image); - $this->tmp_image = ''; - - return $status; - } - - public function crop($prop) - { - // Sanitize and normalize the properties into geometry - $this->sanitize_geometry($prop); - - // Set the IM geometry based on the properties - $geometry = escapeshellarg($prop['width'].'x'.$prop['height'].'+'.$prop['left'].'+'.$prop['top']); - - if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -crop '.$geometry.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function flip($dir) - { - // Convert the direction into a IM command - $dir = ($dir === Image::HORIZONTAL) ? '-flop' : '-flip'; - - if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' '.$dir.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function resize($prop) - { - switch ($prop['master']) - { - case Image::WIDTH: // Wx - $dim = escapeshellarg($prop['width'].'x'); - break; - case Image::HEIGHT: // xH - $dim = escapeshellarg('x'.$prop['height']); - break; - case Image::AUTO: // WxH - $dim = escapeshellarg($prop['width'].'x'.$prop['height']); - break; - case Image::NONE: // WxH! - $dim = escapeshellarg($prop['width'].'x'.$prop['height'].'!'); - break; - } - - // Use "convert" to change the width and height - if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -resize '.$dim.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function rotate($amt) - { - if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -rotate '.escapeshellarg($amt).' -background transparent '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function sharpen($amount) - { - // Set the sigma, radius, and amount. The amount formula allows a nice - // spread between 1 and 100 without pixelizing the image badly. - $sigma = 0.5; - $radius = $sigma * 2; - $amount = round(($amount / 80) * 3.14, 2); - - // Convert the amount to an IM command - $sharpen = escapeshellarg($radius.'x'.$sigma.'+'.$amount.'+0'); - - if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -unsharp '.$sharpen.' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - - return TRUE; - } - - public function composite($properties) - { - if ($error = exec(escapeshellcmd($this->dir.'composite'.$this->ext).' -geometry ' . escapeshellarg('+'.$properties['x'].'+'.$properties['y']).' -dissolve '.escapeshellarg($properties['transparency']).' '.escapeshellarg($properties['overlay_file']).' '.$this->cmd_image.' '.$this->cmd_image)) - { - $this->errors[] = $error; - return FALSE; - } - return TRUE; - } - - protected function properties() - { - return array_slice(getimagesize($this->tmp_image), 0, 2, FALSE); - } - -} // End Image ImageMagick Driver
\ No newline at end of file |