xref: /dokuwiki/vendor/splitbrain/slika/src/ImageMagickAdapter.php (revision 92a8473a9092ab27ad01395a27c47e2679f56d86)
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