宜昌本地软件开发与弱电工程服务商
项目咨询 · 快速响应

[PHP]Kindeditor4.1上传图片时添加水印的功能实现

2016-10-13 00:16:48 点击量:15 标签: 收藏本文

主要修改upload_json.php文件,首先在upload_json.php文件中添加水印函数:

  1. /* 
  2. * 功能:PHP图片水印 (水印支持图片或文字) 
  3. * 参数: 
  4. * $groundImage 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式; 
  5. * $waterPos 水印位置,有10种状态,0为随机位置; 
  6. * 1为顶端居左,2为顶端居中,3为顶端居右; 
  7. * 4为中部居左,5为中部居中,6为中部居右; 
  8. * 7为底端居左,8为底端居中,9为底端居右; 
  9. * $waterImage 图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式; 
  10. * $alpha 水印透明度 
  11. * $waterText 文字水印,即把文字作为为水印,支持ASCII码,不支持中文; 
  12. * $textFont 文字大小,值为1、2、3、4或5,默认为5; 
  13. * $textColor 文字颜色,值为十六进制颜色值,默认为#FF0000(红色); 
  14. * 
  15. * 注意: Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG 
  16. * $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。 
  17. * 当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。 
  18. * 加水印后的图片的文件名和 $groundImage 一样。 
  19. */ 
  20. function imageWaterMark($groundImage, $waterPos=0, $waterImage='', $alpha=80, $waterText='', $water_fontfile, $textFont=9, $textColor='#FF0000'){ 
  21. $isWaterImage = FALSE; 
  22. $formatMsg = '暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。'; 
  23. $fontFile = $water_fontfile; 
  24. //读取水印文件 
  25. if(!emptyempty($waterImage) && file_exists($waterImage)){ 
  26. $isWaterImage = TRUE; 
  27. $water_info = getimagesize($waterImage); 
  28. $water_w = $water_info[0];//取得水印图片的宽 
  29. $water_h = $water_info[1];//取得水印图片的高 
  30. switch($water_info[2])//取得水印图片的格式 
  31. { 
  32. case 1:$water_im = imagecreatefromgif($waterImage);break; 
  33. case 2:$water_im = imagecreatefromjpeg($waterImage);break; 
  34. case 3:$water_im = imagecreatefrompng($waterImage);break; 
  35. default:die($formatMsg); 
  36. } 
  37. } 
  38. //读取背景图片 
  39. if(!emptyempty($groundImage) && file_exists($groundImage)){ 
  40. $ground_info = getimagesize($groundImage); 
  41. $ground_w = $ground_info[0];//取得背景图片的宽 
  42. $ground_h = $ground_info[1];//取得背景图片的高 
  43. switch($ground_info[2])//取得背景图片的格式 
  44. { 
  45. case 1:$ground_im = imagecreatefromgif($groundImage);break; 
  46. case 2:$ground_im = imagecreatefromjpeg($groundImage);break; 
  47. case 3:$ground_im = imagecreatefrompng($groundImage);break; 
  48. default:die($formatMsg); 
  49. } 
  50. }else{ 
  51. alert("需要加水印的图片不存在!"); 
  52. } 
  53. //水印位置 
  54. if($isWaterImage)//图片水印 
  55. { 
  56. $w = $water_w; 
  57. $h = $water_h; 
  58. $label = "图片的"; 
  59. }else{//文字水印 
  60. $temp = imagettfbbox($textFont, 0, $fontFile, $waterText);//取得使用 TrueType 字体的文本的范围 
  61. $w = $temp[2] - $temp[6]; 
  62. $h = $temp[3] - $temp[7]; 
  63. unset($temp); 
  64. $label = "文字区域"; 
  65. } 
  66. if(($ground_w<$w) || ($ground_h<$h)){ 
  67. echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!"; 
  68. return; 
  69. } 
  70. switch($waterPos) 
  71. { 
  72. case 0://随机 
  73. $posX = rand(0,($ground_w - $w)); 
  74. $posY = rand(0,($ground_h - $h)); 
  75. break; 
  76. case 1://1为顶端居左 
  77. $posX = 0; 
  78. $posY = 0; 
  79. break; 
  80. case 2://2为顶端居中 
  81. $posX = ($ground_w - $w) / 2; 
  82. $posY = 0; 
  83. break; 
  84. case 3://3为顶端居右 
  85. $posX = $ground_w - $w; 
  86. $posY = 0; 
  87. break; 
  88. case 4://4为中部居左 
  89. $posX = 0; 
  90. $posY = ($ground_h - $h) / 2; 
  91. break; 
  92. case 5://5为中部居中 
  93. $posX = ($ground_w - $w) / 2; 
  94. $posY = ($ground_h - $h) / 2; 
  95. break; 
  96. case 6://6为中部居右 
  97. $posX = $ground_w - $w; 
  98. $posY = ($ground_h - $h) / 2; 
  99. break; 
  100. case 7://7为底端居左 
  101. $posX = 0; 
  102. $posY = $ground_h - $h; 
  103. break; 
  104. case 8://8为底端居中 
  105. $posX = ($ground_w - $w) / 2; 
  106. $posY = $ground_h - $h; 
  107. break; 
  108. case 9://9为底端居右 
  109. $posX = $ground_w - $w; 
  110. $posY = $ground_h - $h; 
  111. if(!$isWaterImage){ 
  112. $posY = $ground_h - $h-20; 
  113. } 
  114. break; 
  115. default://随机 
  116. $posX = rand(0,($ground_w - $w)); 
  117. $posY = rand(0,($ground_h - $h)); 
  118. break; 
  119. } 
  120. //设定图像的混色模式 
  121. imagealphablending($ground_im, true); 
  122. if($isWaterImage){//图片水印 
  123. //imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件 
  124. //生成混合图像 
  125. imagecopymerge($ground_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h, $alpha); 
  126. }else{//文字水印 
  127. if( !emptyempty($textColor) && (strlen($textColor)==7)){ 
  128. $R = hexdec(substr($textColor,1,2)); 
  129. $G = hexdec(substr($textColor,3,2)); 
  130. $B = hexdec(substr($textColor,5)); 
  131. }else{ 
  132. die("水印文字颜色格式不正确!"); 
  133. } 
  134. imagestring($ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B)); 
  135. } 
  136. //生成水印后的图片 
  137. @unlink($groundImage); 
  138. switch($ground_info[2])//取得背景图片的格式 
  139. { 
  140. case 1:imagegif($ground_im,$groundImage);break; 
  141. case 2:imagejpeg($ground_im,$groundImage);break; 
  142. case 3:imagepng($ground_im,$groundImage);break; 
  143. default:die($errorMsg); 
  144. } 
  145. //释放内存 
  146. if(isset($water_info)) unset($water_info); 
  147. if(isset($water_im)) imagedestroy($water_im); 
  148. unset($ground_info); 
  149. imagedestroy($ground_im); 
  150. } 

然后在

  1. $json = new Services_JSON(); 

行后添加:

  1.     /*水印配置开始*/ 
  2. $water_mark = 1;//1为加水印, 其它为不加 
  3. $water_pos = 9;//水印位置,10种状态【0为随机,1为顶端居左,2为顶端居中,3为顶端居右;4为中部居左,5为中部居中,6为中部居右;7为底端居左,8为底端居中,9为底端居】 
  4. $water_img = $_SERVER['DOCUMENT_ROOT'] .'/assets/img/water.gif';//水印图片,默认填写空,请将图片上传至:attachments/water/目录下,例: logo.gif 
  5. $water_alpha = 60;//水印透明度 
  6. $water_text = '';//水印字符串,默认填写空; 
  7. //$water_fontfile = $_SERVER['DOCUMENT_ROOT'] .'attachments/fonts/arial.ttf';//文字水印使用的字体; 
  8. if($water_mark == 1){ 
  9. imageWaterMark($file_path, $water_pos, $water_img, $water_alpha, $water_text, $water_fontfile); 
  10. } 
  11. /*水印配置结束*/ 
  1. 最好是图片和文字水印只用一种;
  2. 使用potoshop制作的水印图片,保存为8通道且格式为GIF的测试成功。