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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
php 在线打包_支持子目录
Jun 28 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
PHP实现变色验证码实例
Jan 06 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
php实现生成验证码实例分享
Apr 10 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 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
我常用的几个类
2006/10/09 PHP
php代码优化及php相关问题总结
2006/10/09 PHP
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
精通Javascript系列之数值计算
2011/06/07 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
讲解Python中的递归函数
2015/04/27 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
优秀员工自荐书范文
2013/12/08 职场文书
自考生自我评价分享
2014/01/18 职场文书
十八届三中全会感言
2014/03/10 职场文书
民族精神月活动总结
2014/08/28 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python