当前位置:Gxlcms > PHP教程 > 一个超级强大的图片加水印的类_PHP教程

一个超级强大的图片加水印的类_PHP教程

时间:2021-07-01 10:21:17 帮助过:19人阅读

下午没事干,就写了个图片加水印处理的类,本类实现了给图片加文字水印,加图片水印,并且实现了透明度的功能,以供各位网友学习和交流

/**

* 加水印类,支持文字、图片水印以及对透明度的设置、水印图片背景透明。

* @author litx date:2011-12-05下午3点于迈科龙快播研发中心

*/

class WaterMask

{

/**

* 水印类型

* @var int $waterType 0为文字水印 ;1为图片水印

*/

private $waterType = 1;

/**

* 水印位置 类型

* @var int $pos 默认为9(右下角)

*/

private $pos = 9;

/**

* 水印透明度

* @var int $transparent 水印透明度(值越小越透明)

*/

private $transparent = 20;

/**

* 如果是文字水印,则需要加的水印文字

* @var string $waterStr 默认值 (李铁雄个人作品集)

*/

private $waterStr = '个人作品集';

/**

* 文字字体大小

* @var int $fontSize 字体大小

*/

private $fontSize = 14;

/**

* 水印文字颜色(RGB)

* @var array $fontColor 水印文字颜色(RGB)

*/

private $fontColor = array ( 255, 255, 255 );

/**

* 字体文件

* @var unknown_type

*/

private $fontFile = 'AHGBold.ttf';

/**

* 水印图片

* @var string $waterImg

*/

private $waterImg = 'logo.png';

/**

* 需要添加水印的图片

* @var string $srcImg

*/

private $srcImg = '';

/**

* 图片句柄

* @var string $im

*/

private $im = '';

/**

* 水印图片句柄

* @var string $water_im

*/

private $water_im = '';

/**

* 图片信息

* @var array $srcImg_info

*/

private $srcImg_info = '';

/**

* 水印图片信息

* @var array $waterImg_info

*/

private $waterImg_info = '';

/**

* 水印文字宽度

* @var int $str_w

*/

private $str_w = '';

/**

* 水印文字高度

* @var int $str_h

*/

private $str_h = '';

/**

* 水印X坐标

* @var int $x

*/

private $x = '';

/**

* 水印y坐标

* @var int $y

*/

private $y = '';

/**

* 构造函数,通过传入需要加水印的源图片初始化源图片

* @param string $img 需要加水印的源图片

*/

public function __construct ($img)

{

if(file_exists($img)){//源文件存在

$this -> srcImg = $img ;

}else{//源文件不存在

echo '源文件'.$img.'不存在,请检查看文件路径是否正确';

exit();

}

}

/**

* 获取需要添加水印的图片的信息,并载入图片

*/

public function imginfo ()

{

$this -> srcImg_info = getimagesize($this -> srcImg);

var_dump($this -> srcImg_info);exit();

switch ($this -> srcImg_info[2]) {

case 3 ://png

$this -> im = imagecreatefrompng($this -> srcImg);

break 1;

case 2 : // jpeg/jpg

$this -> im = imagecreatefromjpeg($this -> srcImg);

break 1;

case 1 : //gif

$this -> im = imagecreatefromgif($this -> srcImg);

break 1;

default :

echo '源图片文件'. $this -> srcImg .'格式不正确,目前本函数只支持PNG、JPEG、GIF图片水印功能';

exit();

}

}

/**

* 获取水印图片的信息,并载入图片

*/

private function waterimginfo ()

{

$this -> waterImg_info = getimagesize($this -> waterImg);

switch ($this -> waterImg_info[2]) {

case 3 :

$this -> water_im = imagecreatefrompng($this -> waterImg);

break 1;

case 2 :

$this -> water_im = imagecreatefromjpeg($this -> waterImg);

break 1;

case 1 :

$this -> water_im = imagecreatefromgif($this -> waterImg);

break 1;

default :

echo '源图片文件'. $this -> srcImg .'格式不正确,目前本函数只支持PNG、JPEG、GIF图片水印功能';

exit();

}

}

/**

* 水印位置算法

*/

private function waterpos ()

{

switch ($this -> pos) {

case 0 : //随机位置

$this -> x = rand(0, $this -> srcImg_info[0] - $this -> waterImg_info[0]);

$this -> y = rand(0, $this -> srcImg_info[1] - $this -> waterImg_info[1]);

break 1;

case 1 : //上左

$this -> x = 20;

$this -> y = 20;

break 1;

case 2 : //上中

$this -> x = ($this -> srcImg_info[0] - $this -> waterImg_info[0]) / 2;

$this -> y = 20;

break 1;

case 3 : //上右

$this -> x = $this -> srcImg_info[0] - $this -> waterImg_info[0];

$this -> y = 20;

break 1;

case 4 : //中左

$this -> x = 20;

$this -> y = ($this -> srcImg_info[1] - $this -> waterImg_info[1]) / 2;

break 1;

case 5 : //中中

$this -> x = ($this -> srcImg_info[0] - $this -> waterImg_info[0]) / 2;

$this -> y = ($this -> srcImg_info[1] - $this -> waterImg_info[1]) / 2;

break 1;

case 6 : //中右

$this -> x = $this -> srcImg_info[0] - $this -> waterImg_info[0] - 20;

$this -> y = ($this -> srcImg_info[1] - $this -> waterImg_info[1]) / 2;

break 1;

case 7 : //下左

$this -> x = 20;

$this -> y = $this -> srcImg_info[1] - $this -> waterImg_info[1] - 20;

break 1;

case 8 : //下中 www.2cto.com

$this -> x = ($this -> srcImg_info[0] - $this -> waterImg_info[0]) / 2;

$this -> y = $this -> srcImg_info[1] - $this -> waterImg_info[1] - 20;

break 1;

case 9 : //下右

$this -> x = $this -> srcImg_info[0] - $this -> waterImg_info[0] - 20;

$this -> y = $this -> srcImg_info[1] - $this -> waterImg_info[1] - 20;

break 1;

default : //下右

$this -> x = $this -> srcImg_info[0] - $this -> waterImg_info[0] - 20;

$this -> y = $this -> srcImg_info[1] - $this -> waterImg_info[1] - 20;

break 1;

}

}

/**

* 加图片水印

*/

private function waterimg ()

{

if ($this -> srcImg_info[0] <= $this -> waterImg_info[0] || $this -> srcImg_info[1] <= $this -> waterImg_info[1]) {

echo '图片尺寸太小,无法加水印,请上传一张大图片';

exit();

}

//计算水印位置

$this->waterpos();

$cut = imagecreatetruecolor($this -> waterImg_info[0], $this -> waterImg_info[1]);

imagecopy($cut, $this -> im, 0, 0, $this -> x, $this -> y, $this -> waterImg_info[0],

$this -> waterImg_info[1]);

$pct = $this -> transparent;

imagecopy($cut, $this -> water_im, 0, 0, 0, 0, $this -> waterImg_info[0],

$this -> waterImg_info[1]);

//将图片与水印图片合成

imagecopymerge($this -> im, $cut, $this -> x, $this -> y, 0, 0, $this -> waterImg_info[0], $this -> waterImg_info[1], $pct);

}

/**

* 加文字水印

*/

private function waterstr ()

{

$rect = imagettfbbox($this -> fontSize, 0, $this -> fontFile, $this -> waterStr);

$w = abs($rect[2] - $rect[6]);

$h = abs($rect[3] - $rect[7]);

$fontHeight = $this -> fontSize;

$this -> water_im = imagecreatetruecolor($w, $h);

imagealphablending($this -> water_im, false);

imagesavealpha($this -> water_im, true);

$white_alpha = imagecolorallocatealpha($this -> water_im, 255, 255, 255, 127);

imagefill($this -> water_im, 0, 0, $white_alpha);

$color = imagecolorallocate($this -> water_im, $this -> fontColor[0], $this -> fontColor[1],

$this -> fontColor[2]);

imagettftext($this -> water_im, $this -> fontSize, 0, 0, $this -> fontSize, $color,

$this -> fontFile, $this -> waterStr);

$this -> waterImg_info = array (

0 => $w, 1 => $h

);

$this->waterimg();

}

/**

* 水印图片输出

*/

public function output ()

{

$this->imginfo();

if ($this -> waterType == 0) {

$this->waterstr();

} else {

$this->waterimginfo();

$this->waterimg();

}

switch ($this -> srcImg_info[2]) {

case 3 :

imagepng($this -> im, $this -> srcImg);

break 1;

case 2 :

imagejpeg($this -> im, $this -> srcImg);

break 1;

case 1 :

imagegif($this -> im, $this -> srcImg);

break 1;

default :

die('添加水印失败!');

break;

}

//图片合成后的后续销毁处理

imagedestroy($this -> im);

imagedestroy($this -> water_im);

}

}

使用方法示例:

//实例化对象

$obj = new WaterMask('img/10451.jpg');

//类型:0为文字水印、1为图片水印

$obj->waterType = 0;

//水印透明度,值 越小透明度越高

$obj->transparent = 15;

//水印文字

//$obj->waterStr = '生日快乐';

//水印图片

//$obj->waterImg = '';//水印图片

//文字字体大小

$obj->fontSize = 14;

//水印文字颜色(RGB)

$obj->fontColor = array(255,255,100);

//字体文件

$obj->fontFile = 'STCAIYUN.ttf';

//输出水印图片文件覆盖到输入的图片文件

$obj->output();

使用方式比较简单,也很实用。

作者 ltx851201

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478502.htmlTechArticle下午没事干,就写了个图片加水印处理的类,本类实现了给图片加文字水印,加图片水印,并且实现了透明度的功能,以供各位网友学习和...

人气教程排行