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新手上路(十一)
Oct 09 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php学习之流程控制实现代码
Jun 09 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
浅谈PHP中foreach/in_array的使用
Nov 02 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
PHP实现微信退款功能
Oct 02 PHP
Laravel框架路由管理简单示例
May 07 PHP
PHP7 安装event扩展的实现方法
Oct 08 PHP
解决laravel中日志权限莫名变成了root的问题
Oct 17 PHP
Laravel框架处理用户的请求操作详解
Dec 20 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中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jcrop基本参数一览
2013/07/16 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
shiro授权的实现原理
2017/09/21 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
python递归实现快速排序
2018/08/18 Python
python dict 相同key 合并value的实例
2019/01/21 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
珍珠奶茶店创业计划书
2014/01/11 职场文书
迎接领导欢迎词
2014/01/11 职场文书
办公室人员先进事迹
2014/01/27 职场文书
大学开学计划书
2014/04/30 职场文书
教师节宣传方案
2014/05/23 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
教育合作协议范本
2014/10/17 职场文书
企业催款函范本
2015/06/24 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python