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

下午没事干,就写了个图片加水印处理的类,本类实现了给图片加文字水印,加图片水印,并且实现了透明度的功能,以供各位网友学习和交流
<?php
/**  
 * 加水印类,支持文字、图片水印以及对透明度的设置、水印图片背景透明。  
 * @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 : //下中   
                $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();       

 

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值