压缩图片不超过指定的KB

662 阅读1分钟
//图片地址 希望宽度  希望高度  希望最大大小kb 存储路径  名称
public function compressImg($srcFile,$to_width,$to_height,$maxFileSize,$local_dir,$filename)
{
    $info = getimagesize($srcFile);
    $bits = get_headers($srcFile,true);//获取线上图片大小
    $filesize = $bits['Content-Length']/1024;//字节数,除以1024为K数
    if ($filesize <= $maxFileSize) {
        return 0;
    }
    if ($filesize > 1024) {
        $i = 80;
    } elseif ($filesize > 500) {
        $i = 90;
    } else {
        $i = 99;
    }

        //取得当前图片大小
        $width = $info[0];
        $height = $info[1];
        //将文件载入到资源变量im中 1 = GIF,2 = JPG,3 = PNG
        switch ($info[2]) {
            case 1:
                $im = imagecreatefromgif($srcFile);
                $img_type = "gif";
                break;
            case 2:
                $im = imagecreatefromjpeg($srcFile);
                $img_type = "jpg";
                break;
            case 3:
                $im = imagecreatefrompng($srcFile);
                $img_type = "png";
                break;
        }
        do {
            if ($i < 0) {
                return -1;
            }
            if ($filesize > 1024) {
                $step = 5;
            } elseif ($filesize > 500) {
                $step = 3;
            } else {
                $step = 2;
            }
            $tmpFile = $local_dir . time() . '.'.$img_type; //临时文件
            $now_img = imagecreatetruecolor($to_width, $to_height); //新建一个真彩色图像
            //重采样拷贝部分图像并调整大小 可保持较好的清晰度
            imagecopyresampled($now_img, $im, 0, 0, 0, 0, $to_width, $to_height, $width, $height);
            imagejpeg($now_img, $tmpFile, $i); //保存质量为$i的图片文件
            imagedestroy($now_img); //销毁图片资源
            $tmpFileList[] = $tmpFile;
            $i -= $step;
            clearstatcache(); //filesize函数的结果会被缓存,使用此函数清除文件状态缓存
            $filesize = filesize($tmpFile)/1024;
        } while ($filesize > $maxFileSize);
        copy($tmpFile, $filename); //替换源图片
        foreach ($tmpFileList as $tmpFile) { //删除临时文件
            if (is_file($tmpFile)) {
                @unlink($tmpFile);
            }
        }
        //上传到OSS
        $Oss = new Oss();
        $object = 'uid' . UID . '/' . $filename;
        $oss = $Oss->ossUploadFile($object, $filename, true);
        $url = $oss['info']['url'];
        return $url;
    }



//压缩图片
public function getImg(){
    $local_dir = 'uploads/';//临时存储的路径
    createFile($local_dir);
    $filename = "uploads/".time().'.jpg';
    $srcFile = "远程图片路径";
    $url = $this->compressImg($srcFile,200,200,5,$local_dir,$filename);
    dump($url);
}