PHP的生成图片或文字水印的类
2007-12-14 10:51
323 查看
<?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 上传图片,生成水印,支持文字, gif, png
- php生成 文字水印 图片水印
- php生成图片文字水印
- PHP 上传图片,生成水印,支持文字, gif, png
- PHP 上传图片,生成水印,支持文字, gif, png
- PHP 生成文字及图片水印
- PHP 上传图片,生成水印,支持文字, gif, png
- PHP生成图片水印和文字水印
- php文字生成图片以及给图片加水印流程及代码详解
- php 生成文字png图片的代码
- [导入]使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图
- 随时给自己贴的图片加文字的php水印
- php 图片水印+文字水印函数,但是不能设置透明
- 自动生成缩略图,文字水印和图片水印
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图(转)
- 使用ASP.net(C#)批量上传图片并自动生成缩略图,文字水印图,图片水印图
- FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
- php 图片添加文字水印 以及 图片合成(微信快码传播)
- PHP给图片加文字水印
- 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字和图片的水印图