PHP水印类

  1 <?php
  2 /**
  3  * 水印类
  4  * @author    zhaoyingnan    2015/07/16
  5  **/
  6 include_once('extend.php');
  7 class Watermark_extend extends Extend
  8 {
  9     private $_isString;//水印类型是否为字符串
 10     private $_imageInfo;//图片的信息array('dirname' => '路径','basename' => '文件名.扩展名','extension' => '扩展名','filename' => '文件名','type' => 类型,'height' => 高,'width' =>宽)
 11     private $_iAngle = 0;//角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
 12     private $_iPct = 15;//图片水印透明度,值越小透明度越高
 13     private $_srcImage;
 14     private $_resImage;//resource of type (gd)
 15     private $_resWaterImage;//resource of type (gd)
 16     private $_sString = 'Fuck You';//水印文字
 17     private $_iStringSize = 20;//字体大小
 18     private $_trueType;//字体库
 19     private $_waterImg;//水印图片
 20 
 21     /**
 22      * 设置水印参数
 23      * @author    zhaoyingnan    2015/07/16
 24      * @param    string    $image    图片路径
 25      * @param    bool    $isString
 26      * @return    array('error'=>int,'msg'=>string) error大于0为成功,msg为描述
 27      **/
 28     public function setParam($image, $isString)
 29     {
 30         if(!file_exists($image))return array('error'=>-1,'msg'=>'文件不存在');
 31         $this->_trueType    = __ROOTPATH__.'Kreepshow.ttf';//字体库位置
 32         $this->_waterImg    = __ROOTPATH__.'img/logo/logo_16.png';//水印图片位置
 33         $this->_srcImage    = $image;
 34         $this->_isString    = $isString ? true : false;//是否为文字水印
 35         $this->_imageInfo    = pathinfo($this->_srcImage);//图片信息
 36         list($this->_imageInfo['width'], $this->_imageInfo['height'], $this->_imageInfo['type']) = @getimagesize($this->_srcImage);//图片信息
 37         //dump($this->_imageInfo);
 38         switch($this->_imageInfo['type'])
 39         { 
 40         case IMAGETYPE_PNG://3
 41             $this->_resImage = @imagecreatefrompng($this->_srcImage); 
 42             break; 
 43         case IMAGETYPE_JPEG://2
 44             $this->_resImage = @imagecreatefromjpeg($this->_srcImage); 
 45             break; 
 46         case IMAGETYPE_GIF://1
 47             $this->_resImage = @imagecreatefromgif($this->_srcImage); 
 48             break; 
 49         default:
 50             return array('error'=>-2,'msg'=>'文件类型不正确');
 51         }
 52         //dump($this->_resImage);
 53         return array('error'=>1,'msg'=>'ok');
 54     }
 55 
 56     /**
 57      * 计算水印的坐标
 58      * @author    zhaoyingnan    2015/07/17
 59      * @param    int        $iWidth        水印的宽度
 60      * @param    int        $iHeight    水印的高度
 61      * @return    array    array(int $x,int $y)
 62      **/
 63     public function calculatePosition($iWidth, $iHeight)
 64     {
 65         if($this->_imageInfo['width'] < $iWidth || $this->_imageInfo['height'] < $iHeight)
 66             return null;
 67         //return array(($this->_imageInfo['width']-$iWidth)/2, ($this->_imageInfo['height']-$iHeight)/2);
 68         if($this->_isString)
 69             return array($this->_imageInfo['width']/2-$iWidth, $this->_imageInfo['height']/2);
 70         else
 71             return array(($this->_imageInfo['width']-$iWidth)/2, ($this->_imageInfo['height']-$iHeight)/2);
 72     }
 73 
 74     /**
 75      * 执行添加水印
 76      * @author    zhaoyingnan    2015/07/17
 77      * @return    array('error'=>int,'msg'=>string) error大于0为成功,msg为描述
 78      **/
 79     public function executeWater()
 80     {
 81         if($this->_isString)
 82         {
 83             //水印为文字
 84             $black = @imagecolorallocate($this->_resImage, 0, 0, 0);#颜色
 85                 /*
 86                    array imagettfbbox ( float $size , float $angle , string $fontfile , string $text )
 87                    size        像素单位的字体大小。
 88                    angle    text 将被度量的角度大小。
 89                    fontfile    TrueType 字体文件的文件名(可以是 URL)。根据 PHP 所使用的 GD 库版本,可能尝试搜索那些不是以 '/' 开头的文件名并加上 '.ttf' 的后缀并搜索库定义的字体路径
 90                    text        要度量的字符串。
 91                    imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
 92                    0    左下角 X 位置
 93                    1    左下角 Y 位置
 94                    2    右下角 X 位置
 95                    3    右下角 Y 位置
 96                    4    右上角 X 位置
 97                    5    右上角 Y 位置
 98                    6    左上角 X 位置
 99                    7    左上角 Y 位置
100                  */
101             //list(,$rightbottomX,$rightbottomY,,,$lefttopX,$lefttopY) = imagettfbbox($this->_iStringSize, 0, __ROOTPATH__.'movieola.ttf', $this->_sString);
102             list(,$rightbottomX,$rightbottomY,,,$lefttopX,$lefttopY) = @imagettfbbox($this->_iStringSize, $this->_iAngle, $this->_trueType, $this->_sString);
103 
104             //计算水印的宽度,长度
105             $iWidth        = $rightbottomX - $lefttopX;
106             $iHeight    = $rightbottomY - $lefttopY;
107 
108             list($x, $y) = $this->calculatePosition($iWidth, $iHeight);
109 
110             //调试
111             //echo '图片宽度'.$this->_imageInfo['width'].'<br/>';
112             //echo '图片高度'.$this->_imageInfo['height'].'<br/>';
113             //echo '水印宽度'.$iWidth.'<br/>';
114             //echo '水印高度'.$iHeight.'<br/>';
115             //echo '坐标X'.$x.'<br/>';
116             //echo '坐标Y'.$y.'<br/>';
117 
118             if(!$x||!$y)return array('error'=>-3,'msg'=>'图片大小小于水印的大小,无法添加水印');
119             /*
120                imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
121                image    由图象创建函数(例如imagecreatetruecolor())返回的图象资源。
122                size        字体的尺寸。根据 GD 的版本,为像素尺寸(GD1)或点(磅)尺寸(GD2)。
123                angle    角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
124                x        由 x,y 所表示的坐标定义了第一个字符的基本点(大概是字符的左下角)。这和 imagestring() 不同,其 x,y 定义了第一个字符的左上角。例如 "top left" 为 0, 0
125                Y        坐标。它设定了字体基线的位置,不是字符的最底端。
126                color    颜色索引。使用负的颜色索引值具有关闭防锯齿的效果。见 imagecolorallocate()。
127                fontfile    是想要使用的 TrueType 字体的路径。
128                text        UTF-8 编码的文本字符串
129              */
130             //imagettftext($this->_resImage, $this->_iStringSize, 0, $x, $y, $black, __ROOTPATH__.'movieola.ttf', $this->_sString);
131             @imagettftext($this->_resImage, $this->_iStringSize, $this->_iAngle, $x, $y, $black, $this->_trueType, $this->_sString);
132         }
133         else
134         {
135             //图片水印
136             $this->_resWaterImage = @imagecreatefrompng($this->_waterImg);
137             /*
138                bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )
139                将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。
140 
141                bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
142                将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。
143                当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。
144              */
145 
146             list($x, $y) = $this->calculatePosition(16, 16);//已经知道了水印图片的高度和宽度,不用获取了
147             if(!$x||!$y)return array('error'=>-3,'msg'=>'图片大小小于水印的大小,无法添加水印');
148             $bool = @imagecopy($this->_resImage, $this->_resWaterImage, $x, $y, 0, 0, 16, 16);
149             //$bool = @imagecopymerge($this->_resImage, $this->_resWaterImage, $x, $y, 0, 0, 512, 512, $this->_iPct);
150             if(!$bool)return array('error'=>-4,'msg'=>'添加水印失败');
151         }
152 
153         switch($this->_imageInfo['type'])
154         { 
155         case IMAGETYPE_PNG://3
156             $this->_resImage = @imagepng($this->_resImage, $this->_srcImage); 
157             break; 
158         case IMAGETYPE_JPEG://2
159             $this->_resImage = @imagejpeg($this->_resImage, $this->_srcImage); 
160             break; 
161         case IMAGETYPE_GIF://1
162             $this->_resImage = @imagegif($this->_resImage, $this->_srcImage); 
163             break; 
164         default:
165             return array('error'=>-2,'msg'=>'文件类型不正确');
166         }
167         @imagedestroy($this->_resImage);
168         return array('error'=>1,'msg'=>'ok');
169     }
170 }
171 ?>
原文地址:https://www.cnblogs.com/yingnan/p/4661078.html