天天看點

PHP圖檔壓縮到指定的大小

<?php

class imgcompress

{

    private $src;

    private $image;

    private $imageinfo;

    private $percent = 0.5;

    public function __construct($src, $percent = 1)

    {

        $this->src = $src;

        $this->percent = $percent;

    }

    public function compressImg($saveName = '')

    {

        $this->_openImage();

        if (! empty($saveName))

            $this->_saveImage($saveName); // 儲存

        else

            $this->_showImage();

        return true;

    }

    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()

    {

        // $this->percent = $this->imageinfo['width'] ;

        $new_width = $this->imageinfo['width'] * $this->percent;

        $new_height = $this->imageinfo['height'] * $this->percent;

        // $new_width = 1200;

        // $new_height = 900;

        $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;

//         $this->image = imagerotate($this->image, 270, 0);

    }

    private function _showImage()

    {

        header('Content-Type: image/' . $this->imageinfo['type']);

        $funcs = "image" . $this->imageinfo['type'];

        $funcs($this->image);

    }

    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()

    {

        if(!empty($this->image)){

            imagedestroy($this->image);

        }

    }

    public function getimg($to_source, $maxFileSize = 200)

    {

        $source_size = filesize($this->src) / 1024;

        if ($source_size < $maxFileSize) {

            copy($this->src, $to_source);

            return true;

        } else {

            $ys = true;

            $i = 0;

            while ($ys) {

                clearstatcache();

                $this->percent = 0.7;

                // $percent = 0.7;

                if ($i > 0) {

                    $this->src = $to_source;

                }

                $image = $this->compressImg($to_source);

                $to_source_size = filesize($to_source) / 1024;

                // var_dump($to_source_size);

                $ys = $to_source_size > $maxFileSize;

                $i ++;

            }

            // echo "壓縮次數:" . $i;

        }

        return true;

    }

}