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新手上路(三)
Oct 09 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
PHP中的session安全吗?
Jan 22 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 PHP
PHP7 echo和print语句实例用法
Feb 15 PHP
PHP7内核CGI与FastCGI详解
Apr 14 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
PHP通用检测函数集合
2006/11/25 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
JavaScript中Function详解
2015/02/27 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
会计主管岗位职责范文
2013/11/08 职场文书
创先争优一句话承诺
2014/05/29 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python