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设计模式 Interpreter(解释器模式)
Jun 26 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
跟我学Laravel之路由
Oct 15 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
Yii redis集合的基本使用教程
Jun 14 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函数http_build_query使用详解
2014/08/20 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
jquery 学习笔记一
2010/04/07 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Django中处理出错页面的方法
2015/07/15 Python
Python使用gensim计算文档相似性
2016/04/10 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python学习开发mock接口
2019/04/28 Python
浅谈Python 递归算法指归
2019/08/22 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
python实现随机加减法生成器
2020/02/24 Python
python实现密码强度校验
2020/03/18 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
自主招生推荐信范文
2014/05/10 职场文书
升职演讲稿范文
2014/05/23 职场文书
带刀到教室的检讨书
2014/10/04 职场文书