0

0

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

php中文网

php中文网

发布时间:2016-07-13 17:47:21

|

1084人浏览过

|

来源于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] waterImg_info[0] || $this -> srcImg_info[1] 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下午没事干,就写了个图片加水印处理的类,本类实现了给图片加文字水印,加图片水印,并且实现了透明度的功能,以供各位网友学习和...

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

9

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

102

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

59

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

91

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

473

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

50

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号