PHP 压缩图片并保留png图片背景为白色

话不多说直接上代码:

<?php

/**
 图片压缩操作类
 */
class Image
{
  private $src;
  private $imageinfo;
  private $image;
  public $percent = 0.1;
  public function __construct($src)
  {
    $this->src = $src;
  }
  /**
  打开图片
   */
  public 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);
  }
  /**
  操作图片
   */
  public function thumpImage()
  {
    $new_width = $this->imageinfo['width'] * $this->percent;
    $new_height = $this->imageinfo['height'] * $this->percent;
    $image_thump = imagecreatetruecolor($new_width, $new_height);
    //将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
    if($this->imageinfo['type'] == "png"){
        imagealphablending($image_thump, false);//关闭混合模式,以便透明颜色能覆盖原画板
        imagesavealpha($image_thump, true);//设置保存PNG时保留透明通道信息
        $bg = imagecolorallocatealpha($image_thump, 255, 255, 255,127);
        imagefill($image_thump, 0, 0, $bg);
    }
    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;
  }
  /**
  输出图片
   */
  public function showImage()
  {
    header('Content-Type: image/' . $this->imageinfo['type']);
    $funcs = "image" . $this->imageinfo['type'];
    $funcs($this->image);
  }
  /**
  保存图片到硬盘
   */
  public function saveImage($dstImgName)
  {
      if(empty($dstImgName)) return false;
      $funcs = "image".$this->imageinfo['type'];
      $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'];
      }
      if($this->imageinfo['type'] == "png"){
          $funcs($this->image,$dstName,9);
      }elseif ($this->imageinfo['type'] == "jpeg"){
          $funcs($this->image,$dstName,25);
      }else{
          $funcs($this->image,$dstName);
      }
  }
  /**
  销毁图片
   */
  public function __destruct()
  {
    imagedestroy($this->image);
  }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值