• 技術文章
    PHP實現圖片壓縮并同時保持清晰度
    發布日期:2019-06-29 閱讀次數:2229 字體大?。?a href="javascript:;" onclick="ChangeFontSize('content',16)">大

    圖片太大是一個經常遇到的問題,為此很多人頭疼。今天告訴大家如何實現PHP程序簡單實現壓縮:

    圖片原大?。?M

    壓縮后:2M

     

    圖片原圖越大,越能體現出壓縮來。

    現在附上代碼:

    
    /**
     * 圖片壓縮類:通過縮放來壓縮。
     * 如果要保持源圖比例,把參數$percent保持為1即可。
     * 即使原比例壓縮,也可大幅度縮小。數碼相機4M圖片。也可以縮為700KB左右。如果縮小比例,則體積會更小。
     *
     * 結果:可保存、可直接顯示。
     */
    class imgcompress{
        private $src;
        private $image;
        private $imageinfo;
        private $percent = 0.5;
        /**
         * 圖片壓縮
         * @param $src 源圖
         * @param float $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)) $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);
        }
        /**
         * 銷毀圖片
         */
        public function __destruct(){
            imagedestroy($this->image);
        }
    }
    $source =  '123.png';//原圖片名稱
    $dst_img = 'text.png';//壓縮后圖片的名稱
    $percent = 1;  #原圖壓縮,不縮放,但體積大大降低
    $image = (new imgcompress($source,$percent))->compressImg($dst_img);
    国产精品 高清 尿 小便 嘘嘘_无码8090精品久久一区_精品无码专区毛片_一本久道久久综合网