php水印类可以生成图片或文字水印的类

发布时间:2021-01-13编辑:脚本学堂
一个php水印类代码,可能生成图片水印与文字水印,可以将水印输出到浏览器或文件中,可以指定水印位置,不错的php水印类。

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 www.jb200.com
 
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; 
?>