当前位置:首页 > PHP教程 > php应用 > 列表

PHP水印类,支持添加图片、文字、填充颜色区域的实现

发布:smiling 来源: PHP粉丝网  添加日期:2018-07-26 13:40:09 浏览: 评论:0 

*自己整理的一个水印类*支持添加图片、文字、填充颜色区域.

  1. <?php 
  2. /** 
  3.  * 图片加水印类,支持文字水印、透明度设置、自定义水印位置等。 
  4.  * 使用示例: 
  5.  *   $obj = new WaterMask($imgFileName);       //实例化对象 
  6.  *   $obj->$waterType = 1;           //类型:0为文字水印、1为图片水印 
  7.  *   $obj->$transparent = 45;         //水印透明度 
  8.  *   $obj->$waterStr = 'icp.niufee.com';        //水印文字 
  9.  *   $obj->$fontSize = 18;           //文字字体大小 
  10.  *   $obj->$fontColor = array(255,255,255);        //水印文字颜色(RGB) 
  11.  *   $obj->$fontFile = 'AHGBold.ttf';       //字体文件 
  12.  *   &hellip;&hellip; 
  13.  *   $obj->output();              //输出水印图片文件覆盖到输入的图片文件 
  14.  * @modify liuzp111 
  15.  */ 
  16. classWaterMask{ 
  17.   public$waterTypeImage  = false;               //水印类型:启用图片水印 
  18.   public$waterTypeStr   = false;         //水印类型:启用文字水印 
  19.   public$pos       = 0;         //水印位置 
  20.   public$transparent   = 45;        //水印透明度(0---100)数值越大越不透明 
  21.   
  22.   public$waterStr     ='icp.niufee.com';     //水印文字 
  23.   public$fontSize     = 14;        //文字字体大小 
  24.   public$fontColor    =array(0,0,0);         //水印文字颜色(RGB) 默认黑色 
  25.   public$fontFile     ='./font/simfang.ttf';     //字体文件 
  26.   
  27.   public$waterImg     ='logo.png';      //水印图片 
  28.   
  29.   private$srcImg      ='';        //需要添加水印的图片 
  30.   private$im        ='';        //图片句柄 
  31.   private$water_im     ='';        //水印图片句柄 
  32.   private$srcImg_info   ='';        //图片信息 
  33.   private$waterImg_info  ='';        //水印图片信息 
  34.   private$str_w      ='';        //水印文字宽度 
  35.   private$str_h      ='';        //水印文字高度 
  36.   private$x        ='';        //水印X坐标 
  37.   private$y        ='';        //水印y坐标 
  38.   public$output_img    ='';                 //存储输出图片到哪里 
  39.   public$is_draw_rectangle= false;                 //是否绘制矩形区域 (暂不支持自定义位置) 
  40.   //public $rectange_color   = '';                  //绘制矩形区域的颜色  
  41.   private$result_array   =array();              //结果数组 
  42.   publicfunction__construct($img) {   //析构函数 
  43.     //$this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 源文件不存在!'); 
  44.     if(file_exists($img)){ 
  45.       $this->srcImg =$img
  46.     }else
  47.       returnarray('data'=>'','info'=>'源文件不存在!','status'=>0); 
  48.     } 
  49.   } 
  50.   
  51.   privatefunctionimginfo() { //获取需要添加水印的图片的信息,并载入图片。 
  52.     $this->srcImg_info =getimagesize($this->srcImg); 
  53.     switch($this->srcImg_info[2]) { 
  54.       case3: 
  55.         $this->im = imagecreatefrompng($this->srcImg); 
  56.         break1; 
  57.       case2: 
  58.         $this->im = imagecreatefromjpeg($this->srcImg); 
  59.         break1; 
  60.       case1: 
  61.         $this->im = imagecreatefromgif($this->srcImg); 
  62.         break1; 
  63.       default
  64.         //die('原图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。'); 
  65.         returnarray('data'=>'','info'=>'原图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。','status'=>0); 
  66.     } 
  67.   } 
  68.   
  69.   privatefunctionwaterimginfo() { //获取水印图片的信息,并载入图片。 
  70.     $this->waterImg_info =getimagesize($this->waterImg); 
  71.     switch($this->waterImg_info[2]) { 
  72.       case3: 
  73.         $this->water_im = imagecreatefrompng($this->waterImg); 
  74.         break1; 
  75.       case2: 
  76.         $this->water_im = imagecreatefromjpeg($this->waterImg); 
  77.         break1; 
  78.       case1: 
  79.         $this->water_im = imagecreatefromgif($this->waterImg); 
  80.         break1; 
  81.       default
  82.         //die('水印图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。'); 
  83.          returnarray('data'=>'','info'=>'水印图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。','status'=>0); 
  84.     } 
  85.   } 
  86.   privatefunctionwaterpos() { //水印位置算法 
  87.     switch($this->pos) { 
  88.       case0:  //随机位置 
  89.         $this->x = rand(0,$this->srcImg_info[0]-$this->waterImg_info[0]); 
  90.         $this->y = rand(0,$this->srcImg_info[1]-$this->waterImg_info[1]); 
  91.         break1; 
  92.       case1:  //上左 
  93.         $this->x = 0; 
  94.         $this->y = 0; 
  95.         break1; 
  96.       case2:  //上中 
  97.         $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
  98.         $this->y = 0; 
  99.         break1; 
  100.       case3:  //上右 
  101.         $this->x =$this->srcImg_info[0]-$this->waterImg_info[0]; 
  102.         $this->y = 0; 
  103.         break1; 
  104.       case4:  //中左 
  105.         $this->x = 0; 
  106.         $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2; 
  107.         break1; 
  108.       case5:  //中中 
  109.         $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
  110.         $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2; 
  111.         break1; 
  112.       case6:  //中右 
  113.         $this->x =$this->srcImg_info[0]-$this->waterImg_info[0]; 
  114.         $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2; 
  115.         break1; 
  116.       case7:  //下左 
  117.         $this->x = 0; 
  118.         $this->y =$this->srcImg_info[1]-$this->waterImg_info[1]; 
  119.         break1; 
  120.       case8:  //下中 
  121.         $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
  122.         $this->y =$this->srcImg_info[1]-$this->waterImg_info[1]; 
  123.         break1; 
  124.       case9:  //下中偏上100px 
  125.         $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
  126.         $this->y =$this->srcImg_info[1]-$this->waterImg_info[1] - 100; 
  127.         break1; 
  128.       default//下右 
  129.         $this->x =$this->srcImg_info[0]-$this->waterImg_info[0]; 
  130.         $this->y =$this->srcImg_info[1]-$this->waterImg_info[1]; 
  131.         break1; 
  132.     } 
  133.   } 
  134.   /** 
  135.    * 水印文字图片位置,根据需求调整 
  136.    */ 
  137.   privatefunctionwaterposStr() { 
  138.     $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
  139.     $this->y =$this->srcImg_info[1]-$this->waterImg_info[1] - 3;    
  140.   } 
  141.   privatefunctionwaterimg($type='') { 
  142.     if($this->srcImg_info[0] <=$this->waterImg_info[0] ||$this->srcImg_info[1] <=$this->waterImg_info[1]){ 
  143.       //die('水印比原图大!'); 
  144.       returnarray('data'=>'','info'=>'水印比原图大!','status'=>0); 
  145.     } 
  146.     if($type=='waterstr'){ 
  147.       $this->waterposStr(); 
  148.     }else
  149.       $this->waterpos(); 
  150.     } 
  151.     $cut= imagecreatetruecolor($this->waterImg_info[0],$this->waterImg_info[1]); 
  152.     imagecopy($cut,$this->im,0,0,$this->x,$this->y,$this->waterImg_info[0],$this->waterImg_info[1]); 
  153.     $pct=$this->transparent; 
  154.     imagecopy($cut,$this->water_im,0,0,0,0,$this->waterImg_info[0],$this->waterImg_info[1]); 
  155.     imagecopymerge($this->im,$cut,$this->x,$this->y,0,0,$this->waterImg_info[0],$this->waterImg_info[1],$pct); 
  156.   } 
  157.   
  158.   privatefunctionwaterstr() { 
  159.     $rect= imagettfbbox($this->fontSize,0,$this->fontFile,$this->waterStr); 
  160.     $w=abs($rect[2]-$rect[6]); 
  161.     $h=abs($rect[3]-$rect[7]); 
  162.     $fontHeight=$this->fontSize; 
  163.     $this->water_im = imagecreatetruecolor($w,$h); 
  164.     imagealphablending($this->water_im,false); 
  165.     imagesavealpha($this->water_im,true); 
  166.     $white_alpha= imagecolorallocatealpha($this->water_im,255,255,255,127); 
  167.     imagefill($this->water_im,0,0,$white_alpha); 
  168.     $color= imagecolorallocate($this->water_im,$this->fontColor[0],$this->fontColor[1],$this->fontColor[2]); 
  169.     imagettftext($this->water_im,$this->fontSize,0,0,$this->fontSize,$color,$this->fontFile,$this->waterStr); 
  170.     $this->waterImg_info =array(0=>$w,1=>$h); 
  171.     $this->waterimg($type='waterstr'); 
  172.   } 
  173.   /** 
  174.    * 绘制矩形区 
  175.    * bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) 
  176.    * bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col ) 
  177.    * @author liuzp111 
  178.    */ 
  179.   publicfunctiondrawRectangle() 
  180.   { 
  181.     //imagefill($im,0,0,$gray);//填充资源,填充的坐标(类似PS魔棒),颜色 
  182.     /* 
  183.      *  1--------------画长方形-------------- 
  184.      *  bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col ) 
  185.      *  参数: 画布资源, 左上角x坐标,左上y坐标,右下x坐标,右下y坐标,颜色 
  186.      */ 
  187.     $color= imagecolorallocate($this->im,255,255,255);//创建矩形边框颜色和填充颜色 
  188.     //========================================================================= 
  189.     //绘制矩形区域并填充 
  190.     // 参数说明: 
  191.     //bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) 
  192.     // im:为将图像载入为图像资源 
  193.     // $x1:表示矩形左上角的X坐标 
  194.     // $y1:表示矩形左上角的Y坐标 
  195.     // $x2:表示矩形右下角的X坐标 
  196.     // $y2:表示矩形右下角的Y坐标 
  197.     // $color:为填充的RGB颜色 
  198.     // 
  199.     imagefilledrectangle($this->im,3,$this->srcImg_info[1] - 20,$this->srcImg_info[0]-3,$this->srcImg_info[1]-3,$color); 
  200.     //不要使用下方的函数填充,下方填充函数为魔棒填充,容易导致填充不完整 
  201.     //imagefill($this->im,$this->srcImg_info[0]/2,$this->srcImg_info[1]-8,$color);//填充资源,填充的坐标(魔棒),颜色 
  202.   
  203.   } 
  204.   functionoutput() { 
  205.     $this->imginfo(); 
  206.     //是否创建矩形区域 
  207.     if($this->is_draw_rectangle){ 
  208.       $this->drawRectangle(); 
  209.     } 
  210.     if($this->waterTypeStr ) { 
  211.       $this->waterstr(); 
  212.     } 
  213.     if($this->waterTypeImage ) 
  214.     { 
  215.       $this->waterimginfo(); 
  216.       $this->waterimg(); 
  217.     } 
  218.     switch($this->srcImg_info[2]) { 
  219.       case3: 
  220.         $res_output= imagepng($this->im,$this->output_img); 
  221.         break1; 
  222.       case2: 
  223.         $res_output= imagejpeg($this->im,$this->output_img); 
  224.         break1; 
  225.       case1: 
  226.         $res_output= imagegif($this->im,$this->output_img); 
  227.         break1; 
  228.       default
  229.         // die('添加水印失败!'); 
  230.         returnarray('data'=>'','info'=>'添加水印失败!','status'=>0); 
  231.         break
  232.     } //phpfensi.com 
  233.     imagedestroy($this->im); 
  234.     imagedestroy($this->water_im); 
  235.     returnarray('data'=>$res_output,'info'=>'添加水印成功!','status'=>1); 
  236.   } 

使用方式:

  1. $file='58368dddc8c51_22';//需要加水印的图片 
  2. $file_ext='.jpeg';//扩展名 
  3. $imgFileName='./'.$file.$file_ext;//需要加水印图片路径 
  4. $obj=newWaterMask($imgFileName);//实例化对象 
  5. $obj->waterTypeStr = true;    //开启文字水印      
  6. $obj->waterTypeImage = true;   //开启图片水印  
  7. $obj->pos = 9;        //定义水印图片位置 
  8. $obj->waterImg ='./water.png';     //水印图片     
  9. $obj->transparent = 100;         //水印透明度 
  10. $obj->waterStr ='保险经纪人:刘测试 电话:02052552';      //水印文字 
  11. $obj->fontSize = 9;           //文字字体大小 
  12. $obj->fontColor =array(0,0,0);       //水印文字颜色(RGB) 
  13. $obj->fontFile ='./font/msyh.ttc';   //字体文件,这里是微软雅黑 
  14. $obj->is_draw_rectangle = TRUE;     //开启绘制矩形区域 
  15. $obj->output_img ='./'.$file.'_n'.$file_ext;//输出的图片路径 
  16. $obj->output();

Tags: 水印 颜色 区域

分享到: