程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 一個超級強大的圖片加水印的類

一個超級強大的圖片加水印的類

編輯:關於PHP編程

 

下午沒事干,就寫了個圖片加水印處理的類,本類實現了給圖片加文字水印,加圖片水印,並且實現了透明度的功能,以供各位網友學習和交流 

 

<?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 : //下中    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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved