PHP的生成图片或文字水印的类
<?php /*********************************************************** 类名:ImageWatermark 功能:用于生成图片或文字水印 ************************************************************ 合成水印: 1、图像水印appendImageMark(暂不可旋转) 2、文字水印appendTextMark(汉字水印需要设置汉字字体)(可旋转) 输出水印图像:write($filename=null) 1、输出到文件:指定$filename参数为输出的文件名。 2、输出到浏览器:不指定输出文件名,则输出到浏览器. 指定水印位置: 1、指定位置类型$markPosType:(default-0) 1-top left 2-top center 3-top right 4-middle left 5-middle center 6-middle right 7-bottom left 8-bottom center 9-bottom right 0-random 2、设置具体位置setMarkPos($x,$y),若指定具体位置,则上面的位置类型无效。 ************************************************************ */ class ImageWatermark{ public $markPosType = 0; //水印位置,缺省为随机位置输出水印 public $fontFile = "arial.ttf"; //字体文件名 public $color = "#CCCCCC"; //水印字体的颜色 public $fontSize = 12; //水印字体大小 public $angle = 0; //水印文字旋转的角度 private $markPos = array(); private $markImageFile = null, $destImageFile = null; private $mark_res = null, $mark_width = 0, $mark_height = 0, $mark_type = null; private $dest_res = null, $dest_width = 0, $dest_height = 0, $dest_type = null; //用目标图片作为构造函数的参数 public function __construct($destImage){ if(!file_exists($destImage)) return false; $this->destImageFile=$destImage; //获取图片大小、类型 $imageInfo = getimagesize($this->destImageFile); $this->dest_width = $imageInfo[0];$this->dest_height = $imageInfo[1];$this->dest_type = $imageInfo[2]; //得到图片资源句柄 $this->dest_res = $this->getImageResource($this->destImageFile,$this->dest_type); } public function __destruct(){ imagedestroy($this->dest_res); } //添加文字水印 public function appendTextMark($markText){ if($markText==null) return false; //计算水印文本的大小 $box = imagettfbbox($this->fontSize,$this->angle,$this->fontFile,$markText); $this->mark_width = $box[2]-$box[6]; $this->mark_height = $box[3]-$box[7]; //计算水印位置 $pos = ($this->markPos!=null)?$this->markPos:$this->getMarkPosition($this->markPosType); $pos[1]+=$this->mark_height; //将文字打印到图片上 $RGB=$this->colorHexRgb($this->color); $imageColor=imagecolorallocate($this->dest_res,$RGB[0],$RGB[1],$RGB[2]); imagettftext($this->dest_res,$this->fontSize,$this->angle,$pos[0],$pos[1],$imageColor,$this->fontFile,$markText); } //添加图片水印 public function appendImageMark($markImage){ if(!file_exists($markImage)) return false; $this->markImageFile=$markImage; //获取水印图片大小、类型 $imageInfo = getimagesize($this->markImageFile); $this->mark_width = $imageInfo[0];$this->mark_height = $imageInfo[1];$this->mark_type = $imageInfo[2]; //得到图片资源句柄 $this->mark_res = $this->getImageResource($this->markImageFile,$this->mark_type); //计算水印位置 $pos = ($this->markPos!=null)?$this->markPos:$this->getMarkPosition($this->markPosType); //设置图像混色模式 imagealphablending($this->dest_res, true); //复制叠加图像 imagecopy($this->dest_res,$this->mark_res,$pos[0],$pos[1],0,0,$this->mark_width,$this->mark_height); imagedestroy($this->mark_res); } //将叠加水印后的图片写入指定文件,若不定文件名,则输出到浏览器 public function write($filename=null){ $this->writeImage($this->dest_res,$filename,$this->dest_type); } //设置水印x,y坐标 public function setMarkPos($x,$y){ $this->markPos[0]=$x; $this->markPos[1]=$y; } //将十六进制的颜色值分解成RGB形式 private function colorHexRgb($color){ $color = preg_replace("/#/","",$color); $R=hexdec($color[0].$color[1]); $G=hexdec($color[2].$color[3]); $B=hexdec($color[4].$color[5]); return array($R,$G,$B); } //计算水印位置 private function getMarkPosition($type=0){ switch($type){ case 0: $x = rand(0,$this->dest_width-$this->mark_width); $y = rand(0,$this->dest_height-$this->mark_height); break;//random case 1: $x = 0; $y = 0; break;//topleft case 2: $x = ($this->dest_width-$this->mark_width)/2; $y = 0; break; //topcenter case 3: $x = $this->dest_width-$this->mark_width; $y = 0; break;// topright case 4: $x = 0; $y = ($this->dest_height-$this->mark_height)/2; break;//middleleft case 5: $x = ($this->dest_width-$this->mark_width)/2; $y = ($this->dest_height-$this->mark_height)/2; break;//middlecenter case 6: $x = $this->dest_width-$this->mark_width; $y = ($this->dest_height-$this->mark_height)/2; break;//middleright case 7: $x = 0; $y = $this->dest_height-$this->mark_height; break;//bottomleft case 8: $x = ($this->dest_width-$this->mark_width)/2; $y = $this->dest_height-$this->mark_height; break;//bottomcenter case 9: $x = $this->dest_width-$this->mark_width; $y = $this->dest_height-$this->mark_height; break;//bottomright default:$x = rand(0,$this->dest_width-$this->mark_width); $y = rand(0,$this->dest_height-$this->mark_height); break;//random } return array($x,$y); } //从一个图像文件中取得图片资源标识符 private function getImageResource($filename,$type=0){ switch($type){ case 1:return imagecreatefromgif($filename);break; case 2:return imagecreatefromjpeg($filename);break; case 3:return imagecreatefrompng($filename);break; // 以后可添加其它格式 default:return null; } } //将图像写入文件或输出到浏览器 private function writeImage($ImageRes,$filename=null,$type=0){ switch($type) { case 1:imagegif($ImageRes,$filename);break; case 2:imagejpeg($ImageRes,$filename);break; case 3:imagepng($ImageRes,$filename);break; default:return null; } return true; } } //使用示例 $markimg = new ImageWatermark("c_si.jpg"); //$markimg->setMarkPos(100,200);//如何设置setMarkPos,则markPosType无效。 $markimg->markPosType=5; $markimg->appendImageMark("mark.png"); $markimg->fontFile="STCAIYUN.TTF"; $markimg->color="#FFFFFF"; $markimg->fontSize=24; $markimg->angle=45;//设置角度时,注意水印可能旋转出目标图片之外。 $markimg->appendTextMark("汉字水印"); $markimg->write(); $markimg=null; ?>
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: PHP获取HTML网页内容的多种方法(精)
- 下一篇: PostgreSql 合并多行记录