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;

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值