plugin.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. class elFinderPluginWatermark {
  3. private $opts = array();
  4. private $watermarkImgInfo = null;
  5. public function __construct($opts) {
  6. $defaults = array(
  7. 'enable' => true, // For control by volume driver
  8. 'source' => 'logo.png', // Path to Water mark image
  9. 'marginRight' => 5, // Margin right pixel
  10. 'marginBottom' => 5, // Margin bottom pixel
  11. 'quality' => 95, // JPEG image save quality
  12. 'transparency' => 70, // Water mark image transparency ( other than PNG )
  13. 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
  14. 'targetMinPixel' => 200 // Target image minimum pixel size
  15. );
  16. $this->opts = array_merge($defaults, $opts);
  17. }
  18. public function onUpLoadPreSave(&$path, &$name, $src, $elfinder, $volume) {
  19. $opts = $this->opts;
  20. $volOpts = $volume->getOptionsPlugin('Watermark');
  21. if (is_array($volOpts)) {
  22. $opts = array_merge($this->opts, $volOpts);
  23. }
  24. if (! $opts['enable']) {
  25. return false;
  26. }
  27. $srcImgInfo = @getimagesize($src);
  28. if ($srcImgInfo === false) {
  29. return false;
  30. }
  31. // check water mark image
  32. if (! file_exists($opts['source'])) {
  33. $opts['source'] = dirname(__FILE__) . "/" . $opts['source'];
  34. }
  35. if (is_readable($opts['source'])) {
  36. $watermarkImgInfo = @getimagesize($opts['source']);
  37. if (! $watermarkImgInfo) {
  38. return false;
  39. }
  40. } else {
  41. return false;
  42. }
  43. $watermark = $opts['source'];
  44. $marginLeft = $opts['marginRight'];
  45. $marginBottom = $opts['marginBottom'];
  46. $quality = $opts['quality'];
  47. $transparency = $opts['transparency'];
  48. // check target image type
  49. $imgTypes = array(
  50. IMAGETYPE_GIF => IMG_GIF,
  51. IMAGETYPE_JPEG => IMG_JPEG,
  52. IMAGETYPE_PNG => IMG_PNG,
  53. IMAGETYPE_WBMP => IMG_WBMP,
  54. );
  55. if (! ($opts['targetType'] & $imgTypes[$srcImgInfo[2]])) {
  56. return false;
  57. }
  58. // check target image size
  59. if ($opts['targetMinPixel'] > 0 && $opts['targetMinPixel'] > min($srcImgInfo[0], $srcImgInfo[1])) {
  60. return false;
  61. }
  62. $watermark_width = $watermarkImgInfo[0];
  63. $watermark_height = $watermarkImgInfo[1];
  64. $dest_x = $srcImgInfo[0] - $watermark_width - $marginLeft;
  65. $dest_y = $srcImgInfo[1] - $watermark_height - $marginBottom;
  66. if (class_exists('Imagick')) {
  67. return $this->watermarkPrint_imagick($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo);
  68. } else {
  69. return $this->watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo);
  70. }
  71. }
  72. private function watermarkPrint_imagick($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo) {
  73. try {
  74. // Open the original image
  75. $img = new Imagick($src);
  76. // Open the watermark
  77. $watermark = new Imagick($watermark);
  78. // Set transparency
  79. if (strtoupper($watermark->getImageFormat()) !== 'PNG') {
  80. $watermark->setImageOpacity($transparency/100);
  81. }
  82. // Overlay the watermark on the original image
  83. $img->compositeImage($watermark, imagick::COMPOSITE_OVER, $dest_x, $dest_y);
  84. // Set quality
  85. if (strtoupper($img->getImageFormat()) === 'JPEG') {
  86. $img->setImageCompression(imagick::COMPRESSION_JPEG);
  87. $img->setCompressionQuality($quality);
  88. }
  89. $result = $img->writeImage($src);
  90. $img->clear();
  91. $img->destroy();
  92. $watermark->clear();
  93. $watermark->destroy();
  94. return $result ? true : false;
  95. } catch (Exception $e) {
  96. return false;
  97. }
  98. }
  99. private function watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo) {
  100. $watermark_width = $watermarkImgInfo[0];
  101. $watermark_height = $watermarkImgInfo[1];
  102. $ermsg = '';
  103. switch ($watermarkImgInfo['mime']) {
  104. case 'image/gif':
  105. if (@imagetypes() & IMG_GIF) {
  106. $oWatermarkImg = @imagecreatefromgif($watermark);
  107. } else {
  108. $ermsg = 'GIF images are not supported';
  109. }
  110. break;
  111. case 'image/jpeg':
  112. if (@imagetypes() & IMG_JPG) {
  113. $oWatermarkImg = @imagecreatefromjpeg($watermark) ;
  114. } else {
  115. $ermsg = 'JPEG images are not supported';
  116. }
  117. break;
  118. case 'image/png':
  119. if (@imagetypes() & IMG_PNG) {
  120. $oWatermarkImg = @imagecreatefrompng($watermark) ;
  121. } else {
  122. $ermsg = 'PNG images are not supported';
  123. }
  124. break;
  125. case 'image/wbmp':
  126. if (@imagetypes() & IMG_WBMP) {
  127. $oWatermarkImg = @imagecreatefromwbmp($watermark);
  128. } else {
  129. $ermsg = 'WBMP images are not supported';
  130. }
  131. break;
  132. default:
  133. $oWatermarkImg = false;
  134. $ermsg = $watermarkImgInfo['mime'].' images are not supported';
  135. break;
  136. }
  137. if (! $ermsg) {
  138. switch ($srcImgInfo['mime']) {
  139. case 'image/gif':
  140. if (@imagetypes() & IMG_GIF) {
  141. $oSrcImg = @imagecreatefromgif($src);
  142. } else {
  143. $ermsg = 'GIF images are not supported';
  144. }
  145. break;
  146. case 'image/jpeg':
  147. if (@imagetypes() & IMG_JPG) {
  148. $oSrcImg = @imagecreatefromjpeg($src) ;
  149. } else {
  150. $ermsg = 'JPEG images are not supported';
  151. }
  152. break;
  153. case 'image/png':
  154. if (@imagetypes() & IMG_PNG) {
  155. $oSrcImg = @imagecreatefrompng($src) ;
  156. } else {
  157. $ermsg = 'PNG images are not supported';
  158. }
  159. break;
  160. case 'image/wbmp':
  161. if (@imagetypes() & IMG_WBMP) {
  162. $oSrcImg = @imagecreatefromwbmp($src);
  163. } else {
  164. $ermsg = 'WBMP images are not supported';
  165. }
  166. break;
  167. default:
  168. $oSrcImg = false;
  169. $ermsg = $srcImgInfo['mime'].' images are not supported';
  170. break;
  171. }
  172. }
  173. if ($ermsg || false === $oSrcImg || false === $oWatermarkImg) {
  174. return false;
  175. }
  176. if ($srcImgInfo['mime'] === 'image/png') {
  177. if (function_exists('imagecolorallocatealpha')) {
  178. $bg = imagecolorallocatealpha($oSrcImg, 255, 255, 255, 127);
  179. imagefill($oSrcImg, 0, 0 , $bg);
  180. }
  181. }
  182. if ($watermarkImgInfo['mime'] === 'image/png') {
  183. imagecopy($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
  184. } else {
  185. imagecopymerge($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $transparency);
  186. }
  187. switch ($srcImgInfo['mime']) {
  188. case 'image/gif':
  189. imagegif($oSrcImg, $src);
  190. break;
  191. case 'image/jpeg':
  192. imagejpeg($oSrcImg, $src, $quality);
  193. break;
  194. case 'image/png':
  195. if (function_exists('imagesavealpha') && function_exists('imagealphablending')) {
  196. imagealphablending($oSrcImg, false);
  197. imagesavealpha($oSrcImg, true);
  198. }
  199. imagepng($oSrcImg, $src);
  200. break;
  201. case 'image/wbmp':
  202. imagewbmp($oSrcImg, $src);
  203. break;
  204. }
  205. imageDestroy($oSrcImg);
  206. imageDestroy($oWatermarkImg);
  207. return true;
  208. }
  209. }