<?php
/**
* Copyright (C) 2017 Karmabunny Pty Ltd.
*
* This file is a part of SproutCMS.
*
* SproutCMS is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation, either
* version 2 of the License, or (at your option) any later version.
*
* For more information, visit <http://getsproutcms.com>.
*
* This class was originally from Kohana 2.3.4
* Copyright 2007-2008 Kohana Team
*/
namespace Sprout\Helpers\Drivers\Image;
use Kohana_Exception;
use Sprout\Helpers\Image;
use Sprout\Helpers\Drivers\ImageDriver;
/**
* ImageMagick Image Driver.
*/
class ImageMagick extends ImageDriver
{
// 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!)
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
throw new Kohana_Exception('image.imagemagick.not_found', 'convert'.$this->ext);
// Set the installation 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
// Copy the image to the temporary file
copy($image, $this->tmp_image);
// Quality change is done last
$quality = (int) $actions['quality'];
unset($actions['quality']);
// 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->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)
{
{
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
$this->tmp_image = '';
return $status;
}
public function crop($prop)
{
// Sanitize and normalize the properties into geometry
$this->sanitizeGeometry($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
break;
case Image::HEIGHT: // xH
break;
case Image::AUTO: // WxH
break;
case Image::NONE: // WxH!
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)
{
{
$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
if ($error = exec(escapeshellcmd($this->dir.'convert'.$this->ext).' -unsharp '.$sharpen.' '.$this->cmd_image.' '.$this->cmd_image)) {
$this->errors[] = $error;
return FALSE;
}
return TRUE;
}
protected function properties()
{
}
} // End Image ImageMagick Driver