PHP图片水印类的封装


Posted in PHP onJuly 06, 2017

封装PHP的图片水印的类,供大家参考,具体内容如下

<?php
header('Content-type:text/html;charset=utf8');
$img = new Image();
// $img->water('2a.jpg','logo.gif',0);
class Image{
  //路径
  protected $path;
  //是否启用随机名字
  protected $isRandName;
  //要保存的图像类型
  protected $type;
  
  //通过构造方法队成员属性进行初始化
  function __construct($path='./',$isRandName=true,$type='png'){
    $this->path = $path;
    $this->isRandName = $isRandName;
    $this->type = $type;
  }
  //对外公开的水印方法
  
  /**
   * @param char $image  原图
   * @param char $water  水印图片
   * @param char $postion 位置
   * @param int $tmp   透明度
   * @param char $prefix 前缀
   */
  function water($image,$water,$postion,$tmp=100,$prefix='water_'){
    //判断这两个图片是否存在
    if(!file_exists($image)||!file_exists($water)){
      die('图片资源不存在');
    }
    //得到原图和水印图片的宽高
    $imageInfo = self::getImageInfo($image);
    $waterInfo = self::getImageInfo($water);
    //判断水印图片是否能贴上来
    if (!$this->checkImage($imageInfo,$waterInfo)){
      die('水印图片太大');
    }
    //打开图片
    $imageRes = self::openAnyImage($image);
    $waterRes = self::openAnyImage($water);
    //根据水印图片的位置计算水印图片的坐标
    $pos = $this->getPosition($postion,$imageInfo,$waterInfo);
    //将水印图片贴过来
    imagecopymerge($imageRes, $waterRes, $pos['x'], $pos['y'], 0, 0, $waterInfo["width"], $waterInfo["height"], $tmp);
    //得到要保存图片的文件名
    $newName = $this->createNewName($image,$prefix);
    //得到保存图片的路径,也就是文件的全路径
    $newPath = rtrim($this->path,'/').'/'.$newName;
    //保存图片
    $this->saveImage($imageRes,$newPath);
    //销毁资源
    imagedestroy($imageRes);
    imagedestroy($waterRes);
    
    //返回路径
    return $newPath;
  }
  //保存图像资源
  protected function saveImage($imageRes,$newPath){
    $func = 'image'.$this->type;
    //通过变量函数进行保存
    $func($imageRes,$newPath);
  }
  //得到文件名函数
  protected function createNewName($imagePath,$prefix){
    if ($this->isRandName){
      $name = $prefix.uniqid().'.'.$this->type;
    }else {
      $name = $prefix.pathinfo($imagePath)['filename'].'.'.$this->type;
    }
    return $name;
  }
  //根据位置计算水印图片的坐标
  protected function getPosition($postion,$imageInfo,$waterInfo){
    switch ($postion){
      case 1:
        $x = 0;
        $y = 0;
        break;
      case 2:
        $x = ($imageInfo['width']-$waterInfo["width"])/2;
        $y = 0;
        break;
      case 3:
        $x = $imageInfo["width"]- $waterInfo["width"];
        $y = 0;
        break;
      case 4:
        $x = 0;
        $y = ($imageInfo["height"]-$waterInfo["height"])/2;
        break;
      case 5:
        $x = ($imageInfo['width']-$waterInfo["width"])/2;
        $y = ($imageInfo["height"]-$waterInfo["height"])/2;
        break;
      case 6:
        $x = $imageInfo["width"]- $waterInfo["width"];
        $y = ($imageInfo["height"]-$waterInfo["height"])/2;
        break;
      case 7:
        $x = 0;
        $y = $imageInfo['height'] - $waterInfo["height"];
        break;
      case 8:
        $x = ($imageInfo['width']-$waterInfo["width"])/2;
        $y = $imageInfo['height'] - $waterInfo["height"];
        break;
      case 9:
        $x = $imageInfo["width"]- $waterInfo["width"];
        $y = $imageInfo['height'] - $waterInfo["height"];
        break;
      case 0:
        $x = mt_rand(0, $imageInfo["width"]- $waterInfo["width"]);
        $y = mt_rand(0, $imageInfo['height'] - $waterInfo["height"]);
        break;
    }
    return ['x'=>$x , 'y'=>$y];
  }
  protected function checkImage($imageInfo,$waterInfo){
    if (($waterInfo['width'] > $imageInfo['width'])||($waterInfo['height'] > $imageInfo['height'])){
      return false;
    }
    return true;
  }
  //静态方法。根据图片的路径得到图片的信息,宽度,高度、mime类型
  static function getImageInfo($imagePath){
    $info = getimagesize($imagePath);
    $data['width']=$info[0];
    $data['height']=$info[1];
    $data['mime'] = $info['mime'];
    return $data;
  }
  static function openAnyImage($imagePath){
    //得到图像的mime类型
    $mime = self::getImageInfo($imagePath)['mime'];
    //根据不同的mime类型打开不同的图像
    switch ($mime){
      case 'image/png':
          $image = imagecreatefrompng($imagePath);
          break;
      case 'image/gif':
          $image = imagecreatefromgif($imagePath);
          break;
      case 'image/jpeg':
          $image = imagecreatefromjpeg($imagePath);
          break;
      case 'image/wbmp':
          $image = imagecreatefromwbmp($imagePath);
          break;
    }
    return $image;
  }
  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 如何向 MySQL 发送数据
Oct 09 PHP
模板引擎正则表达式调试小技巧
Jul 20 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
PHP中函数rand和mt_rand的区别比较
Dec 26 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
Jun 13 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
php实现的日历程序
Jun 18 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
php生出随机字符串
Jul 06 #PHP
PHP实现的分页类定义与用法示例
Jul 05 #PHP
PHP实现的文件上传类与用法详解
Jul 05 #PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 #PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 #PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 #PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 #PHP
You might like
php分页示例分享
2014/04/30 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
JavaScript实现下拉列表
2021/01/20 Javascript
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
Django的models中on_delete参数详解
2019/07/16 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
某同学的自我鉴定范文
2013/12/26 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
故宫导游词
2015/01/31 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
行为规范主题班会
2015/08/13 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
Java Spring读取和存储详细操作
2022/08/05 Java/Android