PHP添加文字水印或图片水印的水印类完整源代码与使用示例


Posted in PHP onMarch 18, 2019

PHP实现的给图片添加水印功能,可添加文字水印或图片水印,使用文字水印时需要提供字体文件,使用图片水印时需要提供水印图片,水印图片不能比要添加水印的图片大,请使用背景透明的水印图片。

该水印类支持自定义水印位置、自定义水印大小和水印的透明度,字体水印可自定义颜色等,功能已相应完善。

完整源代码如下(注解中已给出使用示例):

<?php
/**
 * 图片加水印类,支持文字水印、透明度设置、自定义水印位置等。
 * 使用示例:
 *   $obj = new WaterMask($imgFileName);  //实例化对象
 *   $obj->$waterType = 1;   //类型:0为文字水印、1为图片水印
 *   $obj->$transparent = 45;   //水印透明度
 *   $obj->$waterStr = '3water.com';  //水印文字
 *   $obj->$fontSize = 18;   //文字字体大小
 *   $obj->$fontColor = array(255,255,255);  //水印文字颜色(RGB)
 *   $obj->$fontFile = 'AHGBold.ttf';  //字体文件
 * ……
 *   $obj->output();    //输出水印图片文件覆盖到输入的图片文件
 */
class WaterMask{
  public $waterType     = 0;   //水印类型:0为文字水印、1为图片水印
  public $pos        = 0;   //水印位置
  public $transparent    = 45;   //水印透明度
  public $waterStr      = '3water.com';  //水印文字
  public $fontSize      = 18;   //文字字体大小
  public $fontColor     = array(255,255,255);  //水印文字颜色(RGB)
  public $fontFile      = 'AHGBold.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坐标
  function __construct($img) {    //析构函数
    $this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 源文件不存在!');
  }
  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。');
    }
  }
  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。');
    }
  }
  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;
      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 waterimg() {
    if ($this->srcImg_info[0] <= $this->waterImg_info[0] || $this->srcImg_info[1] <= $this->waterImg_info[1]){
      die('水印比原图大!');
    }
    $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();
  }
  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);
  }
}
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
PHP输出控制功能在简繁体转换中的应用
Oct 09 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
PHP使用token防止表单重复提交的方法
Apr 07 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP回调函数概念与用法实例分析
Nov 03 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 PHP
Laravel框架源码解析之入口文件原理分析
May 14 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 #PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 #PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 #PHP
PHP标准库(PHP SPL)详解
Mar 16 #PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 #PHP
php生成word并下载代码实例
Mar 15 #PHP
You might like
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php关联数组快速排序的方法
2015/04/17 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
理解Python中的With语句
2015/02/02 Python
Python中的集合介绍
2019/01/28 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
班风口号
2014/06/18 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
初中家长意见
2015/06/03 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
java设计模式--七大原则详解
2021/07/21 Java/Android
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技