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 ?>