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 相关文章推荐
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
php的4种常用运行方式详解
Dec 22 PHP
php实现base64图片上传方式实例代码
Feb 22 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 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使用curl发送json格式数据实例
2013/12/17 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
比较搞笑的js陷阱题
2010/02/07 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
9种python web 程序的部署方式小结
2014/06/30 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
Python自动抢红包教程详解
2019/06/11 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
技校生自我鉴定范文
2013/09/26 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
实战Python爬虫爬取酷我音乐
2022/04/11 Python