ImageWatermark.php
<?php/***********************************************************类名:ImageWatermark功能:用于生成图片或文字水印WDPHP素材源码 http://www.wdphp.com************************************************************合成水印:1、图像水印appendImageMark(暂不可旋转)2、文字水印appendTextMark(汉字水印需要设置汉字字体)(可旋转)输出水印图像:write($filename=null)1、输出到文件:指定$filename参数为输出的文件名。2、输出到浏览器:不指定输出文件名,则输出到浏览器.指定水印位置:1、指定位置类型$markPosType:(default-0)1-top left 2-top center 3-top right4-middle left 5-middle center 6-middle right7-bottom left 8-bottom center 9-bottom right0-random2、设置具体位置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;?>