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 UTF-8、Unicode和BOM问题
May 18 PHP
PHP开发中常用的字符串操作函数
Feb 08 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
php输出xml必须header的解决方法
Oct 17 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
Nov 04 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
简述php环境搭建与配置
Dec 05 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
Js切换功能的简单方法
2010/11/23 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
python缩进区别分析
2014/02/15 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
浅谈flask源码之请求过程
2018/07/26 Python
详解Python传入参数的几种方法
2019/05/16 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
师范生见习总结范文
2015/06/23 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
Redis 哨兵机制及配置实现
2022/03/25 Redis