plugin.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. class elFinderPluginAutoResize {
  3. private $opts = array();
  4. public function __construct($opts) {
  5. $defaults = array(
  6. 'enable' => true, // For control by volume driver
  7. 'maxWidth' => 1024, // Path to Water mark image
  8. 'maxHeight' => 1024, // Margin right pixel
  9. 'quality' => 95, // JPEG image save quality
  10. 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP // Target image formats ( bit-field )
  11. );
  12. $this->opts = array_merge($defaults, $opts);
  13. }
  14. public function onUpLoadPreSave(&$path, &$name, $src, $elfinder, $volume) {
  15. $opts = $this->opts;
  16. $volOpts = $volume->getOptionsPlugin('AutoResize');
  17. if (is_array($volOpts)) {
  18. $opts = array_merge($this->opts, $volOpts);
  19. }
  20. if (! $opts['enable']) {
  21. return false;
  22. }
  23. $srcImgInfo = @getimagesize($src);
  24. if ($srcImgInfo === false) {
  25. return false;
  26. }
  27. // check target image type
  28. $imgTypes = array(
  29. IMAGETYPE_GIF => IMG_GIF,
  30. IMAGETYPE_JPEG => IMG_JPEG,
  31. IMAGETYPE_PNG => IMG_PNG,
  32. IMAGETYPE_WBMP => IMG_WBMP,
  33. );
  34. if (! ($opts['targetType'] & $imgTypes[$srcImgInfo[2]])) {
  35. return false;
  36. }
  37. if ($srcImgInfo[0] > $opts['maxWidth'] || $srcImgInfo[1] > $opts['maxHeight']) {
  38. return $this->resize($src, $srcImgInfo, $opts['maxWidth'], $opts['maxHeight'], $opts['quality']);
  39. }
  40. return false;
  41. }
  42. private function resize($src, $srcImgInfo, $maxWidth, $maxHeight, $quality) {
  43. $zoom = min(($maxWidth/$srcImgInfo[0]),($maxHeight/$srcImgInfo[1]));
  44. $width = round($srcImgInfo[0] * $zoom);
  45. $height = round($srcImgInfo[1] * $zoom);
  46. if (class_exists('Imagick')) {
  47. return $this->resize_imagick($src, $width, $height, $quality);
  48. } else {
  49. return $this->resize_gd($src, $width, $height, $quality, $srcImgInfo);
  50. }
  51. }
  52. private function resize_gd($src, $width, $height, $quality, $srcImgInfo) {
  53. switch ($srcImgInfo['mime']) {
  54. case 'image/gif':
  55. if (@imagetypes() & IMG_GIF) {
  56. $oSrcImg = @imagecreatefromgif($src);
  57. } else {
  58. $ermsg = 'GIF images are not supported';
  59. }
  60. break;
  61. case 'image/jpeg':
  62. if (@imagetypes() & IMG_JPG) {
  63. $oSrcImg = @imagecreatefromjpeg($src) ;
  64. } else {
  65. $ermsg = 'JPEG images are not supported';
  66. }
  67. break;
  68. case 'image/png':
  69. if (@imagetypes() & IMG_PNG) {
  70. $oSrcImg = @imagecreatefrompng($src) ;
  71. } else {
  72. $ermsg = 'PNG images are not supported';
  73. }
  74. break;
  75. case 'image/wbmp':
  76. if (@imagetypes() & IMG_WBMP) {
  77. $oSrcImg = @imagecreatefromwbmp($src);
  78. } else {
  79. $ermsg = 'WBMP images are not supported';
  80. }
  81. break;
  82. default:
  83. $oSrcImg = false;
  84. $ermsg = $srcImgInfo['mime'].' images are not supported';
  85. break;
  86. }
  87. if ($oSrcImg && false != ($tmp = imagecreatetruecolor($width, $height))) {
  88. if (!imagecopyresampled($tmp, $oSrcImg, 0, 0, 0, 0, $width, $height, $srcImgInfo[0], $srcImgInfo[1])) {
  89. return false;
  90. }
  91. switch ($srcImgInfo['mime']) {
  92. case 'image/gif':
  93. imagegif($tmp, $src);
  94. break;
  95. case 'image/jpeg':
  96. imagejpeg($tmp, $src, $quality);
  97. break;
  98. case 'image/png':
  99. if (function_exists('imagesavealpha') && function_exists('imagealphablending')) {
  100. imagealphablending($tmp, false);
  101. imagesavealpha($tmp, true);
  102. }
  103. imagepng($tmp, $src);
  104. break;
  105. case 'image/wbmp':
  106. imagewbmp($tmp, $src);
  107. break;
  108. }
  109. imagedestroy($oSrcImg);
  110. imagedestroy($tmp);
  111. return true;
  112. }
  113. return false;
  114. }
  115. private function resize_imagick($src, $width, $height, $quality) {
  116. try {
  117. $img = new imagick($src);
  118. if (strtoupper($img->getImageFormat()) === 'JPEG') {
  119. $img->setImageCompression(imagick::COMPRESSION_JPEG);
  120. $img->setCompressionQuality($quality);
  121. }
  122. $img->resizeImage($width, $height, Imagick::FILTER_LANCZOS, true);
  123. $result = $img->writeImage($src);
  124. $img->clear();
  125. $img->destroy();
  126. return $result ? true : false;
  127. } catch (Exception $e) {
  128. return false;
  129. }
  130. }
  131. }