1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
<?php /** * elFinder Plugin AutoRotate * * Auto rotation on file upload of JPEG file by EXIF Orientation. * * ex. binding, configure on connector options * $opts = array( * 'bind' => array( * 'upload.presave' => array( * 'Plugin.AutoRotate.onUpLoadPreSave' * ) * ), * // global configure (optional) * 'plugin' => array( * 'AutoRotate' => array( * 'enable' => true, // For control by volume driver * 'quality' => 95, // JPEG image save quality * 'offDropWith' => null // To disable it if it is dropped with pressing the meta key * // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value * // In case of using any key, specify it as an array * ) * ), * // each volume configure (optional) * 'roots' => array( * array( * 'driver' => 'LocalFileSystem', * 'path' => '/path/to/files/', * 'URL' => 'http://localhost/to/files/' * 'plugin' => array( * 'AutoRotate' => array( * 'enable' => true, // For control by volume driver * 'quality' => 95, // JPEG image save quality * 'offDropWith' => null // To disable it if it is dropped with pressing the meta key * // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value * // In case of using any key, specify it as an array * ) * ) * ) * ) * ); * * @package elfinder * @author Naoki Sawada * @license New BSD */ class elFinderPluginAutoRotate extends elFinderPlugin {
public function __construct($opts) { $defaults = array( 'enable' => true, // For control by volume driver 'quality' => 95, // JPEG image save quality 'offDropWith' => null // To disable it if it is dropped with pressing the meta key // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value // In case of using any key, specify it as an array );
$this->opts = array_merge($defaults, $opts);
}
public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume) { $opts = $this->getCurrentOpts($volume); if (! $this->iaEnabled($opts)) { return false; } $imageType = null; $srcImgInfo = null; if (extension_loaded('fileinfo') && function_exists('mime_content_type')) { $mime = mime_content_type($src); if (substr($mime, 0, 5) !== 'image') { return false; } } if (extension_loaded('exif') && function_exists('exif_imagetype')) { $imageType = exif_imagetype($src); } else { $srcImgInfo = getimagesize($src); if ($srcImgInfo === false) { return false; } $imageType = $srcImgInfo[2]; } // check target image type if ($imageType !== IMAGETYPE_JPEG) { return false; } if (! $srcImgInfo) { $srcImgInfo = getimagesize($src); } return $this->rotate($volume, $src, $srcImgInfo, $opts['quality']); } private function rotate($volume, $src, $srcImgInfo, $quality) { if (! function_exists('exif_read_data')) { return false; } $degree = 0; $exif = exif_read_data($src); if($exif && !empty($exif['Orientation'])) { switch($exif['Orientation']) { case 8: $degree = 270; break; case 3: $degree = 180; break; case 6: $degree = 90; break; } } $opts = array( 'degree' => $degree, 'jpgQuality' => $quality, 'checkAnimated' => true ); return $volume->imageUtil('rotate', $src, $opts); } }
|