PHP压缩图片、缩放图片整理

直接上代码:

/**
 * 压缩/缩放-图片- */
class CZImage
{
   private $src;
   private $image;
   private $imageinfo;
   private $percent=0.5;

   /*
   param    $src源图
   param    $percent压缩比例
   */
   public function __construct($src,$percent=1)
   {
      $this->src = $src;
      $this->percent = $percent;
   }



   /*
   param string $saveName 图片名(可不带扩展名用原图名)用于保存。或不提供文件名直接显示
   */
   public function compressImg($saveName='')
   {
      $this->_openImage();
      if(!empty($saveName))
      {
         return $this->_saveImage($saveName);//保存
      }
      else
      {
         $this->_showImage();
      }
   }




   /*
   内部:打开图片
   */
   private function _openImage()
   {
      list($width, $height, $type, $attr) = getimagesize($this->src);
      $this->imageinfo = array(
         'width'=>$width,
         'height'=>$height,
         'type'=>image_type_to_extension($type,false),
         'attr'=>$attr
      );
      $fun = "imagecreatefrom".$this->imageinfo['type'];
      $this->image = $fun($this->src);
      $this->_thumpImage();
   }





   /**
    * 内部:操作图片
    */
   private function _thumpImage()
   {
      $new_width = $this->imageinfo['width'] * $this->percent;
      $new_height = $this->imageinfo['height'] * $this->percent;
      $image_thump = imagecreatetruecolor($new_width,$new_height);
      //将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
      imagecopyresampled($image_thump,$this->image,0,0,0,0,$new_width,$new_height,$this->imageinfo['width'],$this->imageinfo['height']);
      imagedestroy($this->image);
      $this->image = $image_thump;
   }





   /**
    * 输出图片:保存图片则用saveImage()
    */
   private function _showImage()
   {
      header('Content-Type: image/'.$this->imageinfo['type']);
      $funcs = "image".$this->imageinfo['type'];
      $funcs($this->image);
   }





   /**
    * 保存图片到硬盘:
    * @param  string $dstImgName  1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
    */
   private function _saveImage($dstImgName)
   {
      if(empty($dstImgName)) return false;
      $allowImgs = ['.jpg', '.jpeg', '.png', '.bmp', '.wbmp','.gif'];   //如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
      $dstExt =  strrchr($dstImgName ,".");
      $sourseExt = strrchr($this->src ,".");
      if(!empty($dstExt)) $dstExt =strtolower($dstExt);
      if(!empty($sourseExt)) $sourseExt =strtolower($sourseExt);

      //有指定目标名扩展名
      if(!empty($dstExt) && in_array($dstExt,$allowImgs))
      {
         $dstName = $dstImgName;
      }
      elseif(!empty($sourseExt) && in_array($sourseExt,$allowImgs))
      {
         $dstName = $dstImgName.$sourseExt;
      }
      else
      {
         $dstName = $dstImgName.$this->imageinfo['type'];
      }
      $funcs = "image".$this->imageinfo['type'];
      $funcs($this->image,$dstName);
      return $dstName;
   }



   /**
    * @function 等比缩放函数(以保存的方式实现)
    * @param string $picname 被缩放的处理图片源
    * @param int $maxX 缩放后图片的最大宽度
    * @param int $maxY 缩放后图片的最大高度
    * @param string $pre 缩放后图片名的前缀名/文件名
    * @return string 返回后的图片名称(带路径),a.jpg --> s_a.jpg
    */
   public function scalePic($maxX=100,$maxY=100,$pre='')
   {
      $picname = $this->src;
      $info = getimagesize($picname); //获取图片的基本信息
      $width = $info[0];//获取宽度
      $height = $info[1];//获取高度
      //判断图片资源类型并创建对应图片资源
      $im = $this->getPicType($info[2],$picname);
      //计算缩放比例
      $scale = ($maxX/$width)>($maxY/$height)?$maxY/$height:$maxX/$width;
      //计算缩放后的尺寸
      $sWidth = floor($width*$scale);
      $sHeight = floor($height*$scale);
      //创建目标图像资源
      $nim = imagecreatetruecolor($sWidth,$sHeight);
      //等比缩放
      imagecopyresampled($nim,$im,0,0,0,0,$sWidth,$sHeight,$width,$height);
      //输出图像
      $newPicName = $this->outputImage($picname,$pre,$nim);
      //释放图片资源
      imagedestroy($im);
      //imagedestroy($nim);
      $this->image = $nim;
      return $newPicName;
   }

   /**
    * function 判断并返回图片的类型(以资源方式返回)
    * @param int $type 图片类型
    * @param string $picname 图片名字
    * @return 返回对应图片资源
    */
   public function getPicType($type,$picname)
   {
      $im=null;
      switch($type)
      {
         case 1:  //GIF
            $im = imagecreatefromgif($picname);
            break;
         case 2:  //JPG
            $im = imagecreatefromjpeg($picname);
            break;
         case 3:  //PNG
            $im = imagecreatefrompng($picname);
            break;
         case 6:  //BMP
            $im = imagecreatefromwbmp($picname);
            break;
         default:
            die("不认识图片类型");
            break;
      }
      return $im;
   }

   /**
    * function 输出图像
    * @param string $picname 图片名字
    * @param string $pre 新图片名前缀/文件名
    * @param resourse $nim 要输出的图像资源
    * @return 返回新的图片名
    */
   public function outputImage($picname,$pre,$nim)
   {
      $info = getimagesize($picname);
      $picInfo = pathinfo($picname);
      $filename = $pre ? $pre.'.'.$picInfo['extension'] : $picInfo['basename'] ;
      $newPicName = $picInfo['dirname'].'/'.$filename;//输出文件的路径
      switch($info[2])
      {
         case 1:
            imagegif($nim,$newPicName);
            break;
         case 2:
            imagejpeg($nim,$newPicName);
            break;
         case 3:
            imagepng($nim,$newPicName);
            break;
         case 4:
            imagewbmp($nim,$newPicName);
            break;
      }
      return $newPicName;
   }





   /**
    * 销毁图片
    */
   public function __destruct()
   {
      if (!$this->image){return false;}
      imagedestroy($this->image);
   }
}

使用:

$imgfile = 'img.gif';
$czimg = new CZImage($imgfile);
$ccimg = $czimg->compressImg('ccimgtu03');//压缩
print_r($ccimg);
//echo '<br>';
//$iimgg = $czimg->scalePic(1000,600,'newimgtu09');//缩放
//print_r($iimgg);
欢迎广大朋友们一起来学习!


猜你喜欢

转载自blog.csdn.net/weixin_42350070/article/details/80991179
今日推荐