/fm/php/plugins/Watermark/plugin.php

https://gitlab.com/wormen/client.mastodont-engine · PHP · 298 lines · 204 code · 34 blank · 60 comment · 44 complexity · 0ccab652423c3309653f05a3ee8d7c53 MD5 · raw file

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