125 lines
3.0 KiB
PHP
125 lines
3.0 KiB
PHP
<?php
|
|
|
|
|
|
namespace splitbrain\slika;
|
|
|
|
|
|
class ImageMagickAdapter extends Adapter
|
|
{
|
|
/** @var array the CLI arguments to run imagemagick */
|
|
protected $args = [];
|
|
|
|
/** @inheritDoc */
|
|
public function __construct($imagepath, $options = [])
|
|
{
|
|
parent::__construct($imagepath, $options);
|
|
|
|
if (!is_executable($this->options['imconvert'])) {
|
|
throw new Exception('Can not find or run ' . $this->options['imconvert']);
|
|
}
|
|
|
|
$this->args[] = $this->options['imconvert'];
|
|
$this->args[] = $imagepath;
|
|
}
|
|
|
|
/** @inheritDoc */
|
|
public function autorotate()
|
|
{
|
|
$this->args[] = '-auto-orient';
|
|
return $this;
|
|
}
|
|
|
|
/** @inheritDoc */
|
|
public function rotate($orientation)
|
|
{
|
|
$orientation = (int)$orientation;
|
|
if ($orientation < 0 || $orientation > 8) {
|
|
throw new Exception('Unknown rotation given');
|
|
}
|
|
|
|
// rotate
|
|
$this->args[] = '-rotate';
|
|
if (in_array($orientation, [3, 4])) {
|
|
$this->args[] = '180';
|
|
} elseif (in_array($orientation, [5, 6])) {
|
|
$this->args[] = '90';
|
|
} elseif (in_array($orientation, [7, 8])) {
|
|
$this->args[] = '270';
|
|
}
|
|
|
|
// additionally flip
|
|
if (in_array($orientation, [2, 5, 7, 4])) {
|
|
$this->args[] = '-flop';
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
* @throws Exception
|
|
*/
|
|
public function resize($width, $height)
|
|
{
|
|
if ($width == 0 && $height == 0) {
|
|
throw new Exception('You can not resize to 0x0');
|
|
}
|
|
if ($width == 0) $width = '';
|
|
if ($height == 0) $height = '';
|
|
|
|
$size = $width . 'x' . $height;
|
|
|
|
$this->args[] = '-resize';
|
|
$this->args[] = $size;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
* @throws Exception
|
|
*/
|
|
public function crop($width, $height)
|
|
{
|
|
if ($width == 0 && $height == 0) {
|
|
throw new Exception('You can not crop to 0x0');
|
|
}
|
|
|
|
if ($width == 0) $width = $height;
|
|
if ($height == 0) $height = $width;
|
|
|
|
$this->args[] = '-gravity';
|
|
$this->args[] = 'center';
|
|
$this->args[] = '-crop';
|
|
$this->args[] = $width . 'x' . $height . '+0+0';
|
|
$this->args[] = '+repage';
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
* @throws Exception
|
|
*/
|
|
public function save($path, $extension = '')
|
|
{
|
|
if ($extension === 'jpg') {
|
|
$extension = 'jpeg';
|
|
}
|
|
|
|
$this->args[] = '-quality';
|
|
$this->args[] = $this->options['quality'];
|
|
|
|
if ($extension !== '') $path = $extension . ':' . $path;
|
|
$this->args[] = $path;
|
|
|
|
$args = array_map('escapeshellarg', $this->args);
|
|
|
|
$cmd = join(' ', $args);
|
|
$output = [];
|
|
$return = 0;
|
|
exec($cmd, $output, $return);
|
|
|
|
if ($return !== 0) {
|
|
throw new Exception('ImageMagick returned non-zero exit code for ' . $cmd);
|
|
}
|
|
}
|
|
}
|