找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1511|回复: 1

[建站技术] PHP 生成文字或图片水印类

[复制链接]
发表于 2011-6-14 15:55:42 | 显示全部楼层 |阅读模式
PHP 生成文字或图片水印类及使用方法:
  1. <?php   
  2.    
  3. /***********************************************************  
  4.   
  5. 类名:ImageWatermark  
  6.   
  7. 功能:用于生成图片或文字水印  
  8.   
  9. ************************************************************  
  10.   
  11. 合成水印:  
  12.   
  13. 1、图像水印appendImageMark(暂不可旋转)  
  14.   
  15. 2、文字水印appendTextMark(汉字水印需要设置汉字字体)(可旋转)  
  16.   
  17.   
  18.   
  19. 输出水印图像:write($filename=null)  
  20.   
  21. 1、输出到文件:指定$filename参数为输出的文件名。  
  22.   
  23. 2、输出到浏览器:不指定输出文件名,则输出到浏览器.  
  24.   
  25.   
  26.   
  27. 指定水印位置:  
  28.   
  29. 1、指定位置类型$markPosType:(default-0)  
  30.   
  31. 1-top left     2-top center     3-top right  
  32.   
  33. 4-middle left  5-middle center  6-middle right  
  34.   
  35. 7-bottom left  8-bottom center  9-bottom right  
  36.   
  37. 0-random  
  38.   
  39. 2、设置具体位置setMarkPos($x,$y),若指定具体位置,则上面的位置类型无效。  
  40.   
  41. ************************************************************  
  42.   
  43. */   
  44.    
  45. class ImageWatermark{   
  46.    
  47.     public $markPosType = 0;          //水印位置,缺省为随机位置输出水印   
  48.    
  49.     public $fontFile = 'arial.ttf';   //字体文件名   
  50.    
  51.     public $color = 'CCCCCC';        //水印字体的颜色   
  52.    
  53.     public $fontSize = 12;            //水印字体大小   
  54.    
  55.     public $angle = 0;                //水印文字旋转的角度   
  56.    
  57.     private $markPos = array();   
  58.    
  59.     private $markImageFile = null, $destImageFile = null;   
  60.    
  61.     private $mark_res = null, $mark_width = 0, $mark_height = 0, $mark_type = null;   
  62.    
  63.     private $dest_res = null, $dest_width = 0, $dest_height = 0, $dest_type = null;   
  64.    
  65.    
  66.    
  67.     //用目标图片作为构造函数的参数   
  68.    
  69.     public function __construct($destImage){   
  70.    
  71.         if(!file_exists($destImage)) return false;   
  72.    
  73.         $this->destImageFile=$destImage;   
  74.    
  75.         //获取图片大小、类型   
  76.    
  77.         $imageInfo = getimagesize($this->destImageFile);   
  78.    
  79.         $this->dest_width = $imageInfo[0];$this->dest_height = $imageInfo[1];$this->dest_type = $imageInfo[2];   
  80.    
  81.         //得到图片资源句柄   
  82.    
  83.         $this->dest_res = $this->getImageResource($this->destImageFile,$this->dest_type);   
  84.    
  85.     }   
  86.    
  87.     public function __destruct(){   
  88.    
  89.         imagedestroy($this->dest_res);   
  90.    
  91.     }   
  92.    
  93.     //添加文字水印   
  94.    
  95.     public function appendTextMark($markText){   
  96.    
  97.         if($markText==null) return false;   
  98.    
  99.         //计算水印文本的大小   
  100.    
  101.         $box = imagettfbbox($this->fontSize,$this->angle,$this->fontFile,$markText);   
  102.    
  103.         $this->mark_width = $box[2]-$box[6];   
  104.    
  105.         $this->mark_height = $box[3]-$box[7];   
  106.    
  107.         //计算水印位置   
  108.    
  109.         $pos = ($this->markPos!=null)?$this->markPos:$this->getMarkPosition($this->markPosType);   
  110.    
  111.         $pos[1]+=$this->mark_height;   
  112.    
  113.         //将文字打印到图片上   
  114.    
  115.         $RGB=$this->colorHexRgb($this->color);   
  116.    
  117.         $imageColor=imagecolorallocate($this->dest_res,$RGB[0],$RGB[1],$RGB[2]);   
  118.    
  119.         imagettftext($this->dest_res,$this->fontSize,$this->angle,$pos[0],$pos[1],$imageColor,$this->fontFile,$markText);   
  120.    
  121.     }   
  122.    
  123.     //添加图片水印   
  124.    
  125.     public function appendImageMark($markImage){   
  126.    
  127.         if(!file_exists($markImage)) return false;   
  128.    
  129.         $this->markImageFile=$markImage;   
  130.    
  131.         //获取水印图片大小、类型   
  132.    
  133.         $imageInfo = getimagesize($this->markImageFile);   
  134.    
  135.         $this->mark_width = $imageInfo[0];$this->mark_height = $imageInfo[1];$this->mark_type = $imageInfo[2];   
  136.    
  137.         //得到图片资源句柄   
  138.    
  139.         $this->mark_res = $this->getImageResource($this->markImageFile,$this->mark_type);   
  140.    
  141.         //计算水印位置   
  142.    
  143.         $pos = ($this->markPos!=null)?$this->markPos:$this->getMarkPosition($this->markPosType);   
  144.    
  145.         //设置图像混色模式   
  146.    
  147.         imagealphablending($this->dest_res, true);   
  148.    
  149.         //复制叠加图像   
  150.    
  151.         imagecopy($this->dest_res,$this->mark_res,$pos[0],$pos[1],0,0,$this->mark_width,$this->mark_height);   
  152.    
  153.         imagedestroy($this->mark_res);   
  154.    
  155.     }   
  156.    
  157.     //将叠加水印后的图片写入指定文件,若不定文件名,则输出到浏览器   
  158.    
  159.     public function write($filename=null){   
  160.    
  161.         $this->writeImage($this->dest_res,$filename,$this->dest_type);   
  162.    
  163.     }   
  164.    
  165.     //设置水印x,y坐标   
  166.    
  167.     public function setMarkPos($x,$y){   
  168.    
  169.         $this->markPos[0]=$x; $this->markPos[1]=$y;   
  170.    
  171.     }   
  172.    
  173.     //将十六进制的颜色值分解成RGB形式   
  174.    
  175.     private function colorHexRgb($color){   
  176.    
  177.         $color = preg_replace('//','',$color);   
  178.    
  179.         $R=hexdec($color[0].$color[1]);   
  180.    
  181.         $G=hexdec($color[2].$color[3]);   
  182.    
  183.         $B=hexdec($color[4].$color[5]);   
  184.    
  185.         return array($R,$G,$B);   
  186.    
  187.     }   
  188.    
  189.     //计算水印位置   
  190.    
  191.     private function getMarkPosition($type=0){   
  192.    
  193.         switch($type){   
  194.    
  195.             case 0: $x = rand(0,$this->dest_width-$this->mark_width);   
  196.    
  197.                     $y = rand(0,$this->dest_height-$this->mark_height);   
  198.    
  199.                     break;//random   
  200.    
  201.             case 1: $x = 0;   
  202.    
  203.                     $y = 0;   
  204.    
  205.                     break;//topleft  
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|王牌互联

GMT+8, 2024-11-17 06:46 , Processed in 0.034848 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表