PHP不改變圖片長寬只改變圖片體積大小的壓縮方法

如今基本上不少網站都有圖片管理,包括企業站也是,不少圖片爲了保證質量可能須要高清,可是圖片太大的話,對於服務器也是個壓力,每次加載頁面的時候光頁面圖片就得好長時間,影響用戶體驗。php

固然,若是有錢你能夠服務器

1.cdn靜態資源包curl

2.oss管理文件資源,不必定是圖片,也能夠是文件哦網站

3.搭建本身的文件服務器,圖片固然能夠了this

不過以上好是好,不過都得花錢,我感受仍是從根本上解決比較好,來吧,那咱們就上代碼把url

<?php

/**
 * 圖片壓縮類:經過縮放來壓縮。
 * 若是要保持源圖比例,把參數$percent保持爲1便可。
 * 即便原比例壓縮,也可大幅度縮小。數碼相機4M圖片。也能夠縮爲700KB左右。若是縮小比例,則體積會更小。
 *
 * 結果:可保存、可直接顯示。
 */
class imgcompress{
    private $srcurlurl;
    private $image;
    private $imageinfo;
    private $percent = 0.5;
    /**
     * 圖片壓縮
     * @param $srcurl 源圖
     * @param float $percent  壓縮比例
     */
    public function __construct($srcurl, $percent=1)
    {
        $this->src = $srcurl;
        $this->percent = $percent;
    }
    /** 高清壓縮圖片
     * @param string $saveName  提供圖片名(可不帶擴展名,用源圖擴展名)用於保存。或不提供文件名直接顯示
     */
    public function compressImg($saveName='')
    {
        $this->_openImage();
        if(!empty($saveName)) $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  一、可指定字符串不帶後綴的名稱,使用源圖擴展名 。二、直接指定目標圖片名帶擴展名。
     */
    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);
    }
    /**
     * 銷燬圖片
     */
    public function __destruct(){
        imagedestroy($this->image);
    }
}
$source =  '1.jpg';//原圖片名稱
$dst_img = 'text.png';//壓縮後圖片的名稱
$percent = 1;  #原圖壓縮,不縮放,但體積大大下降
$image = (new imgcompress($source,$percent))->compressImg($dst_img);
$image = (new imgcompress($source,$percent))->compressImg($dst_img);  新圖片名字叫什麼名字本身定哦,哈哈 ,不會的再來找我

這是一個圖片類,把類引入你的文件,最後只須要在須要的地方調用這個類裏的方法就能夠了spa

相關文章
相關標籤/搜索