1*92a8473aSAndreas Gohr<?php 2*92a8473aSAndreas Gohr 3*92a8473aSAndreas Gohr 4*92a8473aSAndreas Gohrnamespace splitbrain\slika; 5*92a8473aSAndreas Gohr 6*92a8473aSAndreas Gohr 7*92a8473aSAndreas Gohrclass ImageMagickAdapter extends Adapter 8*92a8473aSAndreas Gohr{ 9*92a8473aSAndreas Gohr /** @var array the CLI arguments to run imagemagick */ 10*92a8473aSAndreas Gohr protected $args = []; 11*92a8473aSAndreas Gohr 12*92a8473aSAndreas Gohr /** @inheritDoc */ 13*92a8473aSAndreas Gohr public function __construct($imagepath, $options = []) 14*92a8473aSAndreas Gohr { 15*92a8473aSAndreas Gohr parent::__construct($imagepath, $options); 16*92a8473aSAndreas Gohr 17*92a8473aSAndreas Gohr if (!is_executable($this->options['imconvert'])) { 18*92a8473aSAndreas Gohr throw new Exception('Can not find or run ' . $this->options['imconvert']); 19*92a8473aSAndreas Gohr } 20*92a8473aSAndreas Gohr 21*92a8473aSAndreas Gohr $this->args[] = $this->options['imconvert']; 22*92a8473aSAndreas Gohr $this->args[] = $imagepath; 23*92a8473aSAndreas Gohr } 24*92a8473aSAndreas Gohr 25*92a8473aSAndreas Gohr /** @inheritDoc */ 26*92a8473aSAndreas Gohr public function autorotate() 27*92a8473aSAndreas Gohr { 28*92a8473aSAndreas Gohr $this->args[] = '-auto-orient'; 29*92a8473aSAndreas Gohr return $this; 30*92a8473aSAndreas Gohr } 31*92a8473aSAndreas Gohr 32*92a8473aSAndreas Gohr /** @inheritDoc */ 33*92a8473aSAndreas Gohr public function rotate($orientation) 34*92a8473aSAndreas Gohr { 35*92a8473aSAndreas Gohr $orientation = (int)$orientation; 36*92a8473aSAndreas Gohr if ($orientation < 0 || $orientation > 8) { 37*92a8473aSAndreas Gohr throw new Exception('Unknown rotation given'); 38*92a8473aSAndreas Gohr } 39*92a8473aSAndreas Gohr 40*92a8473aSAndreas Gohr // rotate 41*92a8473aSAndreas Gohr $this->args[] = '-rotate'; 42*92a8473aSAndreas Gohr if (in_array($orientation, [3, 4])) { 43*92a8473aSAndreas Gohr $this->args[] = '180'; 44*92a8473aSAndreas Gohr } elseif (in_array($orientation, [5, 6])) { 45*92a8473aSAndreas Gohr $this->args[] = '90'; 46*92a8473aSAndreas Gohr } elseif (in_array($orientation, [7, 8])) { 47*92a8473aSAndreas Gohr $this->args[] = '270'; 48*92a8473aSAndreas Gohr } 49*92a8473aSAndreas Gohr 50*92a8473aSAndreas Gohr // additionally flip 51*92a8473aSAndreas Gohr if (in_array($orientation, [2, 5, 7, 4])) { 52*92a8473aSAndreas Gohr $this->args[] = '-flop'; 53*92a8473aSAndreas Gohr } 54*92a8473aSAndreas Gohr return $this; 55*92a8473aSAndreas Gohr } 56*92a8473aSAndreas Gohr 57*92a8473aSAndreas Gohr /** 58*92a8473aSAndreas Gohr * @inheritDoc 59*92a8473aSAndreas Gohr * @throws Exception 60*92a8473aSAndreas Gohr */ 61*92a8473aSAndreas Gohr public function resize($width, $height) 62*92a8473aSAndreas Gohr { 63*92a8473aSAndreas Gohr if ($width == 0 && $height == 0) { 64*92a8473aSAndreas Gohr throw new Exception('You can not resize to 0x0'); 65*92a8473aSAndreas Gohr } 66*92a8473aSAndreas Gohr if ($width == 0) $width = ''; 67*92a8473aSAndreas Gohr if ($height == 0) $height = ''; 68*92a8473aSAndreas Gohr 69*92a8473aSAndreas Gohr $size = $width . 'x' . $height; 70*92a8473aSAndreas Gohr 71*92a8473aSAndreas Gohr $this->args[] = '-resize'; 72*92a8473aSAndreas Gohr $this->args[] = $size; 73*92a8473aSAndreas Gohr return $this; 74*92a8473aSAndreas Gohr } 75*92a8473aSAndreas Gohr 76*92a8473aSAndreas Gohr /** 77*92a8473aSAndreas Gohr * @inheritDoc 78*92a8473aSAndreas Gohr * @throws Exception 79*92a8473aSAndreas Gohr */ 80*92a8473aSAndreas Gohr public function crop($width, $height) 81*92a8473aSAndreas Gohr { 82*92a8473aSAndreas Gohr if ($width == 0 && $height == 0) { 83*92a8473aSAndreas Gohr throw new Exception('You can not crop to 0x0'); 84*92a8473aSAndreas Gohr } 85*92a8473aSAndreas Gohr 86*92a8473aSAndreas Gohr if ($width == 0) $width = $height; 87*92a8473aSAndreas Gohr if ($height == 0) $height = $width; 88*92a8473aSAndreas Gohr 89*92a8473aSAndreas Gohr $this->args[] = '-gravity'; 90*92a8473aSAndreas Gohr $this->args[] = 'center'; 91*92a8473aSAndreas Gohr $this->args[] = '-crop'; 92*92a8473aSAndreas Gohr $this->args[] = $width . 'x' . $height . '+0+0'; 93*92a8473aSAndreas Gohr $this->args[] = '+repage'; 94*92a8473aSAndreas Gohr return $this; 95*92a8473aSAndreas Gohr } 96*92a8473aSAndreas Gohr 97*92a8473aSAndreas Gohr /** 98*92a8473aSAndreas Gohr * @inheritDoc 99*92a8473aSAndreas Gohr * @throws Exception 100*92a8473aSAndreas Gohr */ 101*92a8473aSAndreas Gohr public function save($path, $extension = '') 102*92a8473aSAndreas Gohr { 103*92a8473aSAndreas Gohr if ($extension === 'jpg') { 104*92a8473aSAndreas Gohr $extension = 'jpeg'; 105*92a8473aSAndreas Gohr } 106*92a8473aSAndreas Gohr 107*92a8473aSAndreas Gohr $this->args[] = '-quality'; 108*92a8473aSAndreas Gohr $this->args[] = $this->options['quality']; 109*92a8473aSAndreas Gohr 110*92a8473aSAndreas Gohr if ($extension !== '') $path = $extension . ':' . $path; 111*92a8473aSAndreas Gohr $this->args[] = $path; 112*92a8473aSAndreas Gohr 113*92a8473aSAndreas Gohr $args = array_map('escapeshellarg', $this->args); 114*92a8473aSAndreas Gohr 115*92a8473aSAndreas Gohr $cmd = join(' ', $args); 116*92a8473aSAndreas Gohr $output = []; 117*92a8473aSAndreas Gohr $return = 0; 118*92a8473aSAndreas Gohr exec($cmd, $output, $return); 119*92a8473aSAndreas Gohr 120*92a8473aSAndreas Gohr if ($return !== 0) { 121*92a8473aSAndreas Gohr throw new Exception('ImageMagick returned non-zero exit code for ' . $cmd); 122*92a8473aSAndreas Gohr } 123*92a8473aSAndreas Gohr } 124*92a8473aSAndreas Gohr} 125