123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- /**
- * elFinder Plugin AutoResize
- * Auto resize on file upload.
- * ex. binding, configure on connector options
- * $opts = array(
- * 'bind' => array(
- * 'upload.presave' => array(
- * 'Plugin.AutoResize.onUpLoadPreSave'
- * )
- * ),
- * // global configure (optional)
- * 'plugin' => array(
- * 'AutoResize' => array(
- * 'enable' => true, // For control by volume driver
- * 'maxWidth' => 1024, // Path to Water mark image
- * 'maxHeight' => 1024, // Margin right pixel
- * 'quality' => 95, // JPEG image save quality
- * 'preserveExif' => false, // Preserve EXIF data (Imagick only)
- * 'forceEffect' => false, // For change quality or make progressive JPEG of small images
- * 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
- * 'offDropWith' => null, // Enabled by default. 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
- * 'onDropWith' => null // Disabled by default. To enable 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(
- * 'AutoResize' => array(
- * 'enable' => true, // For control by volume driver
- * 'maxWidth' => 1024, // Path to Water mark image
- * 'maxHeight' => 1024, // Margin right pixel
- * 'quality' => 95, // JPEG image save quality
- * 'preserveExif' => false, // Preserve EXIF data (Imagick only)
- * 'forceEffect' => false, // For change quality or make progressive JPEG of small images
- * 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
- * 'offDropWith' => null, // Enabled by default. 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
- * 'onDropWith' => null // Disabled by default. To enable 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 elFinderPluginAutoResize extends elFinderPlugin
- {
- public function __construct($opts)
- {
- $defaults = array(
- 'enable' => true, // For control by volume driver
- 'maxWidth' => 1024, // Path to Water mark image
- 'maxHeight' => 1024, // Margin right pixel
- 'quality' => 95, // JPEG image save quality
- 'preserveExif' => false, // Preserve EXIF data (Imagick only)
- 'forceEffect' => false, // For change quality or make progressive JPEG of small images
- 'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
- '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
- 'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
- );
- $this->opts = array_merge($defaults, $opts);
- }
- public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
- {
- if (!$src) {
- return false;
- }
- $opts = $this->getCurrentOpts($volume);
- if (!$this->iaEnabled($opts, $elfinder)) {
- 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);
- if ($imageType === false) {
- return false;
- }
- } else {
- $srcImgInfo = getimagesize($src);
- if ($srcImgInfo === false) {
- return false;
- }
- $imageType = $srcImgInfo[2];
- }
- // check target image type
- $imgTypes = array(
- IMAGETYPE_GIF => IMG_GIF,
- IMAGETYPE_JPEG => IMG_JPEG,
- IMAGETYPE_PNG => IMG_PNG,
- IMAGETYPE_BMP => IMG_WBMP,
- IMAGETYPE_WBMP => IMG_WBMP
- );
- if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
- return false;
- }
- if (!$srcImgInfo) {
- $srcImgInfo = getimagesize($src);
- }
- if ($opts['forceEffect'] || $srcImgInfo[0] > $opts['maxWidth'] || $srcImgInfo[1] > $opts['maxHeight']) {
- return $this->resize($volume, $src, $srcImgInfo, $opts['maxWidth'], $opts['maxHeight'], $opts['quality'], $opts['preserveExif']);
- }
- return false;
- }
- private function resize($volume, $src, $srcImgInfo, $maxWidth, $maxHeight, $jpgQuality, $preserveExif)
- {
- $zoom = min(($maxWidth / $srcImgInfo[0]), ($maxHeight / $srcImgInfo[1]));
- $width = round($srcImgInfo[0] * $zoom);
- $height = round($srcImgInfo[1] * $zoom);
- $unenlarge = true;
- $checkAnimated = true;
- return $volume->imageUtil('resize', $src, compact('width', 'height', 'jpgQuality', 'preserveExif', 'unenlarge', 'checkAnimated'));
- }
- }
|