PHP水印类,支持添加图片、文字、填充颜色区域的实现


Posted in PHP onFebruary 04, 2017

*自己整理的一个水印类*

支持添加图片、文字、填充颜色区域

<?php
/**
 * 图片加水印类,支持文字水印、透明度设置、自定义水印位置等。
 * 使用示例:
 *   $obj = new WaterMask($imgFileName);       //实例化对象
 *   $obj->$waterType = 1;           //类型:0为文字水印、1为图片水印
 *   $obj->$transparent = 45;         //水印透明度
 *   $obj->$waterStr = 'icp.niufee.com';        //水印文字
 *   $obj->$fontSize = 18;           //文字字体大小
 *   $obj->$fontColor = array(255,255,255);        //水印文字颜色(RGB)
 *   $obj->$fontFile = 'AHGBold.ttf';       //字体文件
 *   ……
 *   $obj->output();              //输出水印图片文件覆盖到输入的图片文件
 * @modify liuzp111
 */
class WaterMask{
  public $waterTypeImage   = false;                //水印类型:启用图片水印
  public $waterTypeStr    = false;          //水印类型:启用文字水印
  public $pos        = 0;          //水印位置
  public $transparent    = 45;         //水印透明度(0---100)数值越大越不透明

  public $waterStr      = 'icp.niufee.com';      //水印文字
  public $fontSize      = 14;         //文字字体大小
  public $fontColor     = array(0,0,0);          //水印文字颜色(RGB) 默认黑色
  public $fontFile      = './font/simfang.ttf';      //字体文件

  public $waterImg      = 'logo.png';       //水印图片

  private $srcImg       = '';         //需要添加水印的图片
  private $im         = '';         //图片句柄
  private $water_im      = '';         //水印图片句柄
  private $srcImg_info    = '';         //图片信息
  private $waterImg_info   = '';         //水印图片信息
  private $str_w       = '';         //水印文字宽度
  private $str_h       = '';         //水印文字高度
  private $x         = '';         //水印X坐标
  private $y         = '';         //水印y坐标
  public $output_img     = '';                  //存储输出图片到哪里
  public $is_draw_rectangle = false;                  //是否绘制矩形区域 (暂不支持自定义位置)
  //public $rectange_color   = '';                  //绘制矩形区域的颜色  
  private $result_array    = array();               //结果数组 
  public function __construct($img) {    //析构函数
    //$this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 源文件不存在!');
    if(file_exists($img)){
      $this->srcImg = $img;
    }else{
      return array('data'=>'','info'=>'源文件不存在!','status'=>0);
    }
  }

  private function imginfo() {  //获取需要添加水印的图片的信息,并载入图片。
    $this->srcImg_info = getimagesize($this->srcImg);
    switch ($this->srcImg_info[2]) {
      case 3:
        $this->im = imagecreatefrompng($this->srcImg);
        break 1;
      case 2:
        $this->im = imagecreatefromjpeg($this->srcImg);
        break 1;
      case 1:
        $this->im = imagecreatefromgif($this->srcImg);
        break 1;
      default:
        //die('原图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。');
        return array('data'=>'','info'=>'原图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。','status'=>0);
    }
  }

  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:
        //die('水印图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。');
         return array('data'=>'','info'=>'水印图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。','status'=>0);
    }
  }
  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 = 0;
        $this->y = 0;
        break 1;
      case 2:   //上中
        $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
        $this->y = 0;
        break 1;
      case 3:   //上右
        $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
        $this->y = 0;
        break 1;
      case 4:   //中左
        $this->x = 0;
        $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];
        $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
        break 1;
      case 7:   //下左
        $this->x = 0;
        $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
        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];
        break 1;
      case 9:   //下中偏上100px
        $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
        $this->y = $this->srcImg_info[1]-$this->waterImg_info[1] - 100;
        break 1;
      default:  //下右
        $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
        $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
        break 1;
    }
  }
  /**
   * 水印文字图片位置,根据需求调整
   */
  private function waterposStr() {
    $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
    $this->y = $this->srcImg_info[1]-$this->waterImg_info[1] - 3;    
  }
  private function waterimg($type='') {
    if ($this->srcImg_info[0] <= $this->waterImg_info[0] || $this->srcImg_info[1] <= $this->waterImg_info[1]){
      //die('水印比原图大!');
      return array('data'=>'','info'=>'水印比原图大!','status'=>0);
    }
    if($type == 'waterstr'){
      $this->waterposStr();
    }else{
      $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($type='waterstr');
  }
  /**
   * 绘制矩形区
   * bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
   * bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col )
   * @author liuzp111
   */
  public function drawRectangle()
  {
    //imagefill($im,0,0,$gray);//填充资源,填充的坐标(类似PS魔棒),颜色
    /*
     *  1--------------画长方形--------------
     *  bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col )
     *  参数: 画布资源, 左上角x坐标,左上y坐标,右下x坐标,右下y坐标,颜色
     */
    $color = imagecolorallocate($this->im,255,255,255);//创建矩形边框颜色和填充颜色
    //=========================================================================
    //绘制矩形区域并填充
    // 参数说明:
    //bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
    // im:为将图像载入为图像资源
    // $x1:表示矩形左上角的X坐标
    // $y1:表示矩形左上角的Y坐标
    // $x2:表示矩形右下角的X坐标
    // $y2:表示矩形右下角的Y坐标
    // $color:为填充的RGB颜色
    //
    imagefilledrectangle($this->im,3,$this->srcImg_info[1] - 20,$this->srcImg_info[0]-3,$this->srcImg_info[1]-3,$color);
    //不要使用下方的函数填充,下方填充函数为魔棒填充,容易导致填充不完整
    //imagefill($this->im,$this->srcImg_info[0]/2,$this->srcImg_info[1]-8,$color);//填充资源,填充的坐标(魔棒),颜色

  }
  function output() {
    $this->imginfo();
    //是否创建矩形区域
    if($this->is_draw_rectangle){
      $this->drawRectangle();
    }
    if ($this->waterTypeStr ) {
      $this->waterstr();
    } 
    if($this->waterTypeImage )
    {
      $this->waterimginfo();
      $this->waterimg();
    }
    switch ($this->srcImg_info[2]) {
      case 3:
        $res_output = imagepng($this->im,$this->output_img);
        break 1;
      case 2:
        $res_output = imagejpeg($this->im,$this->output_img);
        break 1;
      case 1:
        $res_output = imagegif($this->im,$this->output_img);
        break 1;
      default:
        // die('添加水印失败!');
        return array('data'=>'','info'=>'添加水印失败!','status'=>0);
        break;
    }
    imagedestroy($this->im);
    imagedestroy($this->water_im);
    return array('data'=>$res_output,'info'=>'添加水印成功!','status'=>1);
  }
}

使用方式:

$file = '58368dddc8c51_22';//需要加水印的图片
$file_ext = '.jpeg';//扩展名
$imgFileName = './'.$file.$file_ext;//需要加水印图片路径
$obj = new WaterMask($imgFileName); //实例化对象
$obj->waterTypeStr = true;     //开启文字水印      
$obj->waterTypeImage = true;    //开启图片水印  
$obj->pos = 9;         //定义水印图片位置 
$obj->waterImg = './water.png';      //水印图片     
$obj->transparent = 100;          //水印透明度
$obj->waterStr = '保险经纪人:刘测试 电话:02052552';       //水印文字
$obj->fontSize = 9;            //文字字体大小
$obj->fontColor = array(0,0,0);        //水印文字颜色(RGB)
$obj->fontFile = './font/msyh.ttc';    //字体文件,这里是微软雅黑
$obj->is_draw_rectangle = TRUE;      //开启绘制矩形区域
$obj ->output_img = './'.$file.'_n'.$file_ext;//输出的图片路径
$obj->output();

以上这篇PHP水印类,支持添加图片、文字、填充颜色区域的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php分页函数
Jul 08 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
PHP操作数组的一些函数整理介绍
Jul 17 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
浅析php数据类型转换
Jan 09 PHP
php实现下载限制速度示例分享
Feb 13 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 PHP
Yii2下session跨域名共存的解决方案
Feb 04 #PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 #PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 #PHP
php基于dom实现的图书xml格式数据示例
Feb 03 #PHP
PHP遍历目录文件的常用方法小结
Feb 03 #PHP
详解yii2实现分库分表的方案与思路
Feb 03 #PHP
php获取客户端IP及URL的方法示例
Feb 03 #PHP
You might like
中国的第一台收音机
2021/03/01 无线电
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
php实现加减法验证码代码
2014/02/14 PHP
跟我学Laravel之配置Laravel
2014/10/15 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
laravel自定义分页效果
2017/07/23 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
用python实现刷点击率的示例代码
2019/02/21 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Python hashlib模块的使用示例
2020/10/09 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers