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.MVC的模板标签系统(一)
Sep 05 PHP
php基础知识:类与对象(3) 构造函数和析构函数
Dec 13 PHP
PHP开发负载均衡指南
Jul 17 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
php基于mcrypt的加密解密实例
Oct 27 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
Oct 10 PHP
php 多继承的几种常见实现方法示例
Nov 18 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
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
js兼容的placeholder属性详解
2013/08/18 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
python 阶乘累加和的实例
2019/02/01 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
化学学院毕业生自荐信范文
2013/12/17 职场文书
办公室助理岗位职责
2013/12/25 职场文书
项目合作协议书
2014/09/23 职场文书
地陪导游欢迎词
2015/01/26 职场文书
个人委托书范文
2015/01/28 职场文书
学习党章心得体会2016
2016/01/15 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android