Home  >  Article  >  Backend Development  >  PHP adds watermark to pictures and generates thumbnails

PHP adds watermark to pictures and generates thumbnails

WBOY
WBOYOriginal
2016-07-25 08:42:31829browse
1 Add watermark to pictures
2生成一个新的缩率图
  1. class Image{
  2. //水印配置项
  3. private $waterOn;
  4. private $waterImg;
  5. private $waterPos;
  6. private $waterPct;
  7. private $waterText;
  8. private $waterFont;
  9. private $waterTextSize;
  10. private $waterTextColor;
  11. private $qua;
  12. //缩略图配置项
  13. private $thumbWidth;
  14. private $thumbHeight;
  15. private $thumbType;
  16. private $thumbEndfix;
  17. //构造函数
  18. public function __construct(){
  19. $this->waterOn=C("WATER_ON");
  20. $this->waterImg=C("WATER_IMG");
  21. $this->waterPos=C("WATER_POS");
  22. $this->waterPct=C("WATER_PCT");
  23. $this->waterText=C("WATER_TEXT");
  24. $this->waterFont=C("WATER_FONT");
  25. $this->waterTextSize=C("WATER_TEXT_SIZE");
  26. $this->waterTextColor=C("WATER_TEXT_COLOR");
  27. $this->qua=C("WATER_QUA");
  28. //缩率图
  29. $this->thumbWidth=C("THUMB_WIDTH");
  30. $this->thumbHeight=C("THUMB_HEIGHT");
  31. $this->thumbType=C("THUMB_TYPE");
  32. $this->thumbEndFix=C("THUMB_ENDFIX");
  33. }
  34. /*
  35. *验证图片是否合法
  36. */
  37. private function check($img){
  38. return is_file($img)&&getimagesize($img)&&extension_loaded("gd");
  39. }
  40. /*
  41. *缩率图
  42. *@param string $img 原图
  43. *@param string $outFile 缩率之后存储的图片
  44. *@param int $thumbWidth 缩率图宽度
  45. *@param int $thumbHeight 缩率图高度
  46. *@param int $thumbType 那种方式进行缩略处理
  47. */
  48. public function thumb($img,$outFile="",$thumbWidth="",$thumbHeight="",$thumbType=""){
  49. if(!$this->check($img)){
  50. return false;
  51. }
  52. //缩率图处理方式
  53. $thumbType=$thumbType?$thumbType:$this->thumbType;
  54. //缩率图宽度
  55. $thumbWidth=$thumbWidth?$thumbWidth:$this->thumbWidth;
  56. //缩率图高度
  57. $thumbHeight=$thumbHeight?$thumbHeight:$this->thumbHeight;
  58. //获取原图信息
  59. $imgInfo=getimagesize($img);
  60. //原图宽度
  61. $imgWidth=$imgInfo[0];
  62. //原图高度
  63. $imgHeight=$imgInfo[1];
  64. //获得原图类型
  65. $imgtype=image_type_to_extension($imgInfo[2]);
  66. //根据不同的缩略处理方式,获得尺寸(原图和缩略图相应的尺寸)
  67. $thumb_size=$this->thumbsize($imgWidth,$imgHeight,$thumbWidth,$thumbHeight,$thumbType);
  68. //创建原图
  69. $func="imagecreatefrom".substr($imgtype,1);//变量函数
  70. $resImg=$func($img);
  71. //创建缩率图画布
  72. if($imgtype==".gif"){
  73. $res_thumb=imagecreate($thumb_size[2],$thumb_size[3]);
  74. }else{
  75. $res_thumb=imagecreatetruecolor($thumb_size[2],$thumb_size[3]);
  76. }
  77. imagecopyresized($res_thumb,$resImg,0,0,0,0,$thumb_size[2],$thumb_size[3],$thumb_size[0],$thumb_size[1]);
  78. $fileInfo=pathinfo($img);//文件信息
  79. $outFile=$outFile?$outFile:$fileInfo['filename'].$this->thumbEndFix.$fileInfo['extension'];//文件名称
  80. $outFile=$fileInfo["dirname"]."/".$outFile;//加上目录
  81. $func="image".substr($imgtype,1);
  82. $func($res_thumb,$outFile);
  83. return $outFile;
  84. }
  85. private function thumbSize($imgWidth,$imgHeight,$thumbWidth,$thumbHeight,$thumbType){
  86. //缩率图尺寸
  87. $w=$thumbWidth;
  88. $h=$thumbHeight;
  89. //原图尺寸
  90. $img_w=$imgWidth;
  91. $img_h=$imgHeight;
  92. switch($thumbType){
  93. case 1:
  94. //宽度固定,高度自增
  95. $h=$w/$imgWidth*$imgHeight;
  96. break;
  97. case 2://高度固定,宽度自
  98. $w=$h/$imgHeight*$imgWidth;
  99. break;
  100. case 3:
  101. if($imgHeight/$thumbHeight>$imgWidth/$thumbWidth){
  102. $img_h=$imgWidth/$thumbWidth*$thumbHeight;
  103. }else{
  104. $img_w=$imgHeight/$thumbHeight*$thumbWidth;
  105. }
  106. }
  107. return array($img_w,$img_h,$w,$h);
  108. }
  109. /*
  110. *@param string $img 原图
  111. *@param string $outImg 加完水印后生成的图
  112. *@param int $pos 水印位置
  113. *@param int $pct 透明度
  114. *@param text $text 水印文字
  115. *@param string $waterImg水印图片
  116. */
  117. public function water($img,$outImg=null,$pos="",$pct="",$text="",$waterImg="",$textColor=""){
  118. if(!$this->check($img)){
  119. return false;
  120. }
  121. //加完水印后生成的图
  122. $outImg=$outImg?$outImg:$img;
  123. //水印位置
  124. $pos=$pos?$pos:$this->waterPos;
  125. //透明度
  126. $pct=$pct?$pct:$this->waterPct;
  127. //水印文字
  128. $text=$text?$text:$this->waterText;
  129. //水印图片
  130. $waterImg=$waterImg?$waterImg:$this->waterImg;
  131. //验证水印图片
  132. $waterImgOn=$this->check($waterImg);
  133. //水印文字颜色
  134. $textColor=$textColor?$textColor:$this->waterTextColor;
  135. //原图信息
  136. $imgInfo=getimagesize($img);
  137. //原图宽度
  138. $imgWidth=$imgInfo[0];
  139. //原图高度
  140. $imgHeight=$imgInfo[1];
  141. switch($imgInfo[2]){
  142. case 1:
  143. $resImg=imagecreatefromgif($img);
  144. break;
  145. case 2:
  146. $resImg=imagecreatefromjpeg($img);
  147. break;
  148. case 3:
  149. $resImg=imagecreatefrompng($img);
  150. break;
  151. }
  152. if($waterImgOn){//水印图片有效
  153. //水印信息
  154. $waterInfo=getimagesize($waterImg);
  155. //水印宽度
  156. $waterWidth=$waterInfo[0];
  157. //水印高度
  158. $waterHeight=$waterInfo[1];
  159. //根据不同的情况创建不同的类型 gif jpeg png
  160. $w_img=null;
  161. switch($waterInfo[2]){
  162. case 1:
  163. $w_img=imagecreatefromgif($waterImg);
  164. break;
  165. case 2:
  166. $w_img=imagecreatefromjpeg($waterImg);
  167. break;
  168. case 3:
  169. $w_img=imagecreatefrompng($waterImg);
  170. }
  171. }else{//水印图片失效,使用文字水印
  172. if(empty($text)||strlen($textColor)!==7){
  173. return false;
  174. }
  175. //获得文字水印盒子信息
  176. $textInfo=imagettfbbox($this->waterTextSize,0,$this->waterFont,$text);
  177. //文字信息宽度
  178. $textWidth=$textInfo[2]-$textInfo[6];
  179. //文字信息高度
  180. $textHeight=$textInfo[3]-$textInfo[7];
  181. }
  182. //水印位置
  183. $x=$y=20;
  184. switch($pos){
  185. case 1:
  186. break;
  187. case 2:
  188. $x=($imgWidth-$waterWidth)/2;
  189. break;
  190. case 3:
  191. $y=$imgWidth-$waterWidth-10;
  192. break;
  193. case 4:
  194. $x=($imgHeight-$waterHeight)/2;
  195. break;
  196. case 5:
  197. $x=($imgWidth-$waterWidth)/2;
  198. $y=($imgHeight-$waterHeight)/2;
  199. break;
  200. case 6:
  201. $x=$imgWidth-$waterWidth-10;
  202. $y=($imgHeight-$waterHeight)/2;
  203. break;
  204. case 7:
  205. $x=$imgHeight-$waterHeight-10;
  206. break;
  207. case 8:
  208. $x=($imgWidth-$waterWidth)/2;
  209. $y=$imgHeight-$waterHeight-10;
  210. break;
  211. case 9:
  212. $x=$imgWidth-$waterWidth-10;
  213. $y=$imgHeight-$waterHeight-10;
  214. break;
  215. default:
  216. $x=mt_rand(20,$imgWidth-$waterWidth);
  217. $y=mt_rand(20,$imgHeight-$waterHeight);
  218. }
  219. if($waterImgOn){//当水印图片有效时,以图片形式加水印
  220. if($waterInfo[2]==3){
  221. imagecopy($resImg,$w_img,$x,$y,0,0,$waterWidth,$waterHeight);
  222. }else{
  223. imagecopymerge($resImg,$w_img,$x,$y,0,0,$waterInfo,$waterHeight,$pct);
  224. }
  225. }else{//水印图片失效,以文字水印加
  226. $red=hexdec(substr($this->waterTextColor,1,2));
  227. $greem=hexdec(substr($this->waterTextColor,3,2));
  228. $blue=hexdec(substr($this->waterTextColor,5,2));
  229. $color=imagecolorallocate($resImg,$red,$greem,$blue);
  230. imagettftext($resImg,$this->waterTextSize,0,$x,$y,$color,$this->waterFont,$text);
  231. }
  232. //输出图片
  233. switch($imgInfo[2]){
  234. case 1:
  235. imagegif($resImg,$outImg);
  236. break;
  237. case 2:
  238. imagejpeg($resImg,$outImg);
  239. break;
  240. case 3:
  241. imagepng($resImg,$outImg);
  242. break;
  243. }
  244. //垃圾回收
  245. if(isset($resImg)){
  246. imagedestroy($resImg);
  247. }
  248. if(isset($w_img)){
  249. imagedestroy($w_img);
  250. }
  251. return true;
  252. }
  253. }
  254. ?>
复制代码

  1. return array(
  2. //水印处理
  3. "WATER_ON"=>1,//水印开关
  4. "WATER_IMG"=>"./data/logo.png",//水印图片
  5. "WATER_POS"=>9,//水印位置
  6. "WATER_PCT"=>80,//水印透明度
  7. "WATER_TEXT"=>"http://www.caoxiaobin.cn",
  8. "WATER_FONT"=>"./data/simsunb.ttf",//水印字体
  9. "WATER_TEXT_COLOR"=>"#333333",//文字颜色 16进制表示
  10. "WATER_TEXT_SIZE"=>16,//文字大小
  11. "WATER_QUA"=>80,//图片压缩比
  12. //缩略图
  13. "THUMB_WIDTH"=>150,//缩率图宽度
  14. "THUMB_HEIGHT"=>150,//缩略图高度
  15. "THUMB_TYPE"=>1,//缩略图处理 1宽度固定,高度自增 2高度固定,宽度自增 //缩略图尺寸不变,对原图进行裁切
  16. "THUMB_ENDFIX"=>"_thmub"//缩略图后缀
  17. );
  18. ?>
复制代码

  1. /*
  2. * Case-insensitive data key detection
  3. */
  4. function array_key_exists_d($key,$arr){
  5. $_key=strtolower($key);
  6. foreach ($arr as $k= >$v){
  7. if($_key==strtolower($k)){
  8. return true;
  9. }
  10. }
  11. }
  12. /*
  13. * Recursively change the KEY (key name) of the array
  14. * @param array;
  15. * @stat int 0 lowercase 1 uppercase
  16. */
  17. function array_change_key_case_d($arr,$stat=0){
  18. $func=$stat?"strtoupper":"strtolower";
  19. $_newArr=array();
  20. if (!is_array($arr)||empty($arr)){
  21. return $_newArr;
  22. }
  23. foreach($arr as $k=>$v){
  24. $_k=$func($k);/ /Convert KEY case through variable function
  25. $_newArr[$_k]= is_array($v)?array_change_key_case_d($v):$v;
  26. }
  27. return $_newArr;
  28. }
  29. /*
  30. * Read and set configuration Item
  31. * @param $name void Configuration item name, if not filled in, all configuration items will be returned
  32. * @param $value void Configuration item value
  33. * @param $value value false null Only take the $name value
  34. */
  35. function C ($name=null,$value=null){
  36. static $config=array();//Static variable $config stores all configuration items
  37. if(is_null($name)){
  38. return $config;
  39. }
  40. / /If $name is an array
  41. if(is_array($name)){
  42. return $config=array_merge($config,array_change_key_case_d($name,1));
  43. }
  44. //Two cases where $name is a string$value No value means getting the value of the configuration item, value means changing the configuration item
  45. if(is_string($name)){
  46. $name= strtoupper($name);
  47. //Get the value of the configuration item
  48. if(is_null($value )){
  49. return array_key_exists_d($name,$config)?$config[$name]:null;
  50. }else{
  51. //Set value
  52. $config[$name]=$value;
  53. return true;
  54. }
  55. }
  56. }
Copy code

PHP, thumbnail image


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn