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 相关文章推荐
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
PHP递归删除目录几个代码实例
Apr 21 PHP
php实现过滤UBB代码的类
Mar 12 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
php实现CSV文件导入和导出
Oct 24 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
phalcon框架使用指南
Feb 23 PHP
Thinkphp微信公众号支付接口
Aug 04 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
PHP whois查询类定义与用法示例
Apr 03 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横向重复区域显示二法
2008/09/25 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
DOM精简教程
2006/10/03 Javascript
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
简单理解Python中基于生成器的状态机
2015/04/13 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
如何更优雅地写python代码
2019/07/02 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
幼儿园毕业教师感言
2014/02/21 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
一年级小学生评语大全
2014/12/25 职场文书
教师工作证明范本
2015/06/12 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python