找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 449|回复: 0
打印 上一主题 下一主题

一个经典实用的PHP图像处理类分享

[复制链接]

2600

主题

2600

帖子

7736

积分

论坛元老

Rank: 8Rank: 8

积分
7736
跳转到指定楼层
楼主
发表于 2018-2-14 05:52:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本图像处理类可以完成对图片的缩放、加水印和裁剪的功能,支持多种图片类型的处理,缩放时进行优化等。
path = rtrim($path,"/")."/";
  }

  /**
   * 对指定的图像进行缩放
   * @param  string $name  是需要处理的图片名称
   * @param  int $width   缩放后的宽度
   * @param  int $height   缩放后的高度
   * @param  string $qz   是新图片的前缀
   * @return mixed      是缩放后的图片名称,失败返回false;
   */
  function thumb($name, $width, $height,$qz="th_"){
    /* 获取图片宽度、高度、及类型信息 */
    $$this->getInfo($name);
    /* 获取背景图片的资源 */
    $srcImg = $this->getImg($name, $);
    /* 获取新图片尺寸 */
    $size = $this->getNewSize($name,$width, $height,$);
    /* 获取新的图片资源 */
    $newImg = $this->kidOfImage($srcImg, $size,$);
    /* 通过本类的私有方法,保存缩略图并返回新缩略图的名称,以"th_"为前缀 */
    return $this->createNewImage($newImg, $qz.$name,$);
  }

  /**
   * 为图片添加水印
   * @param  string $groundName 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式
   * @param  string $waterName 图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式
   * @param  int $waterPos    水印位置,有10种状态,0为随机位置;
   *                1为顶端居左,2为顶端居中,3为顶端居右;
   *                4为中部居左,5为中部居中,6为中部居右;
   *                7为底端居左,8为底端居中,9为底端居右;
   * @param  string $qz     加水印后的图片的文件名在原文件名前面加上这个前缀
   * @return  mixed        是生成水印后的图片名称,失败返回false
   */
  function waterMark($groundName, $waterName, $waterPos=0, $qz="wa_"){
    /*获取水印图片是当前路径,还是指定了路径*/
    $curpath = rtrim($this->path,"/")."/";
    $dir = dirname($waterName);
    if($dir == "."){
      $wpath = $curpath;
    }else{
      $wpath = $dir."/";
      $waterName = basename($waterName);
    }

    /*水印图片和背景图片必须都要存在*/
    if(file_exists($curpath.$groundName) && file_exists($wpath.$waterName)){
      $groundInfo = $this->getInfo($groundName);        //获取背景信息
      $waterInfo = $this->getInfo($waterName, $dir);      //获取水印图片信息
      /*如果背景比水印图片还小,就会被水印全部盖住*/
      if(!$pos = $this->position($groundInfo, $waterInfo, $waterPos)){
        echo '水印不应该比背景图片小!';
        return false;
      }

      $groundImg = $this->getImg($groundName, $groundInfo);  //获取背景图像资源
      $waterImg = $this->getImg($waterName, $waterInfo, $dir); //获取水印图片资源

      /* 调用私有方法将水印图像按指定位置复制到背景图片中 */
      $groundImg = $this->copyImage($groundImg, $waterImg, $pos, $waterInfo);
      /* 通过本类的私有方法,保存加水图片并返回新图片的名称,默认以"wa_"为前缀 */
      return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);

    }else{
      echo '图片或水印图片不存在!';
      return false;
    }
  }

  /**
   * 在一个大的背景图片中剪裁出指定区域的图片
   * @param  string $name  需要剪切的背景图片
   * @param  int $x     剪切图片左边开始的位置
   * @param  int $y     剪切图片顶部开始的位置
   * @param  int $width   图片剪裁的宽度
   * @param  int $height   图片剪裁的高度
   * @param  string $qz   新图片的名称前缀
   * @return  mixed      裁剪后的图片名称,失败返回false;
   */
  function cut($name, $x, $y, $width, $height, $qz="cu_"){
    $$this->getInfo($name);         //获取图片信息
    /* 裁剪的位置不能超出背景图片范围 */
    if( (($x+$width) > $['width']) || (($y+$height) > $['height'])){
      echo "裁剪的位置超出了背景图片范围!";
      return false;
    }

    $back = $this->getImg($name, $);     //获取图片资源
    /* 创建一个可以保存裁剪后图片的资源 */
    $cut($width, $height);
    /* 使用imagecopyresampled()函数对图片进行裁剪 */
    imagecopyresampled($cutimg, $back, 0, 0, $x, $y, $width, $height, $width, $height);
    imagedestroy($back);
    /* 通过本类的私有方法,保存剪切图并返回新图片的名称,默认以"cu_"为前缀 */
    return $this->createNewImage($cutimg, $qz.$name,$);
  }

  /* 内部使用的私有方法,用来确定水印图片的位置 */
  private function position($groundInfo, $waterInfo, $waterPos){
    /* 需要加水印的图片的长度或宽度比水印还小,无法生成水印 */
    if( ($groundInfo["width"]$posX, "posY"=>$posY);
  }

  /* 内部使用的私有方法,用于获取图片的属性信息(宽度、高度和类型) */
  private function getInfo($name, $path=".") {
    $spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/';

    $data = getimagesize($spath.$name);
    $["width"]  = $data[0];
    $["height"] = $data[1];
    $["type"]  = $data[2];

    return $;
  }

  /*内部使用的私有方法, 用于创建支持各种图片格式(jpg,gif,png三种)资源 */
  private function getImg($name, $, $path='.'){

    $spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/';
    $srcPic = $spath.$name;

    switch ($["type"]) {
      case 1:         //gif
        $($srcPic);
        break;
      case 2:         //jpg
        $($srcPic);
        break;
      case 3:         //png
        $($srcPic);
        break;
      default:
        return false;
        break;
    }
    return $img;
  }

  /* 内部使用的私有方法,返回等比例缩放的图片宽度和高度,如果原图比缩放后的还小保持不变 */
  private function getNewSize($name, $width, $height, $){
    $size["width"] = $["width"];     //原图片的宽度
    $size["height"] = $["height"];    //原图片的高度

    if($width  $["height"] * $size["height"]){
      $size["height"] = round($["height"]*$size["width"]/$["width"]);
    }else{
      $size["width"] = round($["width"]*$size["height"]/$["height"]);
    }

    return $size;
  }

  /* 内部使用的私有方法,用于保存图像,并保留原有图片格式 */
  private function createNewImage($newImg, $newName, $){
    $this->path = rtrim($this->path,"/")."/";
    switch ($["type"]) {
      case 1:       //gif
        $result = imageGIF($newImg, $this->path.$newName);
        break;
      case 2:       //jpg
        $result = imageJPEG($newImg,$this->path.$newName);
        break;
      case 3:       //png
        $result = imagePng($newImg, $this->path.$newName);
        break;
    }
    imagedestroy($newImg);
    return $newName;
  }

  /* 内部使用的私有方法,用于加水印时复制图像 */
  private function copyImage($groundImg, $waterImg, $pos, $waterInfo){
    imagecopy($groundImg, $waterImg, $pos["posX"], $pos["posY"], 0, 0, $waterInfo["width"],$waterInfo["height"]);
    imagedestroy($waterImg);
    return $groundImg;
  }

  /* 内部使用的私有方法,处理带有透明度的图片保持原样 */
  private function kidOfImage($srcImg, $size, $){
    $newImg = imagecreatetruecolor($size["width"], $size["height"]);
    $otsc = imagecolortransparent($srcImg);
    if( $otsc >= 0 && $otsc
            
            
您可能感兴趣的文章:
  • 9段PHP实用功能的代码推荐
  • 几个实用的PHP内置函数使用指南
  • 简单实用的PHP防注入类实例
  • 一款简单实用的php操作mysql数据库类
  • 非常实用的PHP常用函数汇总
  • 制作安全性高的PHP网站的几个实用要点
  • Thinkphp中的curd应用实用要点
  • 9个实用的PHP代码片段分享
  • PHP实用函数分享之去除多余的0
  • 7个鲜为人知却非常实用的PHP函数
  • PHP实现简单实用的验证码类
  • 6个超实用的PHP代码片段
  • PHP判断字符串长度的两种方法很实用
  • PHPStrom中实用的功能和快捷键大全
  • 四个PHP非常实用的功能
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端