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+mysql保存和输出文件
Oct 09 PHP
PHP 批量删除数据的方法分析
Oct 30 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
两千行代码的PHP学习笔记汇总
Oct 05 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
php生成RSS订阅的方法
Feb 13 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 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 curl 并发最佳实践代码分享
2012/09/05 PHP
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
基于JQuery制作的产品广告效果
2010/12/08 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
p5.js临摹动态图形的方法
2019/10/23 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
python实现自动更换ip的方法
2015/05/05 Python
Python 实现简单的电话本功能
2015/08/09 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
四年级下册教学反思
2014/02/01 职场文书
安全生产标语
2014/06/06 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
人力资源部工作计划
2019/05/14 职场文书
2019新员工心得体会
2019/06/25 职场文书