PHP图片水印类的封装

发布时间 - 2026-01-11 02:12:29    点击率:

封装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图片水印  # PHP水印类  # 基于PHP实现生成随机水印图片  # PHP实现随机生成水印图片功能  # 如何使用PHP给图片加水印  # PHP图片添加水印功能示例小结  # php图片添加水印例子  # PHP实现图片加水印功能  # 这两个  # 太大  # 不存在  # 贴上  # 是否能  # 具体内容  # 大家多多  # 是否存在  # png  # true  # char  # param  # function  # isRandName  # __construct  # path  # prefix  # file_exists  # postion  # image 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel API资源类怎么用_Laravel API Resource数据转换  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  中山网站推广排名,中山信息港登录入口?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  ,怎么在广州志愿者网站注册?  大同网页,大同瑞慈医院官网?  如何用低价快速搭建高质量网站?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何获取PHP WAP自助建站系统源码?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  香港服务器WordPress建站指南:SEO优化与高效部署策略  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何生成腾讯云建站专用兑换码?  如何在搬瓦工VPS快速搭建网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  JS弹性运动实现方法分析  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel如何升级到最新版本?(升级指南和步骤)  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  高防服务器如何保障网站安全无虞?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何用好域名打造高点击率的自主建站?  北京专业网站制作设计师招聘,北京白云观官方网站?  在Oracle关闭情况下如何修改spfile的参数  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Linux系统命令中screen命令详解  微信小程序 闭包写法详细介绍  Bootstrap整体框架之CSS12栅格系统  如何登录建站主机?访问步骤全解析  如何在服务器上配置二级域名建站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel怎么在Controller之外的地方验证数据  如何用PHP工具快速搭建高效网站?  如何挑选高效建站主机与优质域名?  教学论文网站制作软件有哪些,写论文用什么软件 ?  html5的keygen标签为什么废弃_替代方案说明【解答】  JavaScript中的标签模板是什么_它如何扩展字符串功能  Thinkphp 中 distinct 的用法解析  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全