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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值