老板要求把图标压缩到30kb以内。前提是图片的宽高没有变化,只是压缩了体积。对于jpg/jpeg等有损压缩类型的图像,这个要求很简单。循环调用GD库的imagejpeg函数设置图片质量。直到图像尺寸小于设定值。对于png/gif格式的图片,就没那么简单了。对于这种格式的图片,一般使用GD库的imagecopyresampled函数来重新复制图片。可以减小音量。这种方法只有效一次,不能满足需求。官方的解释是:imagecopyresampled()将正方形区域从一幅图像复制到另一幅图像,平滑地插值像素值,因此,除其他外,缩小图像的大小,同时仍然保持很高的清晰度。嗯,我也没看懂。不过好像很厉害。。。所以~转换图片类型:png->jpg,gif->jpg然后用imagejpeg函数设置好图片的质量就可以保存了。当然,如果是gif图片,压缩后一定不能动/***@paramstring$img_src要压缩的图片路径*@paramstring$save_src压缩后保存的图片路径*@paramint$max_size_limit图片大小limitunitkb*@returninteger压缩图像大小单位kb*@throws\Throwable*/publicstaticfunctionimgCompress(string$img_src,string$save_src,float$max_size_limit=0){if($max_size_limit==0)return0;$file_size=intval(文件大小($img_src)/1024);如果($file_size<=$max_size_limit)返回$file_size;$img_info=getimagesize($img_src);$type=image_type_to_extension($img_info[2],false);throw_if(!in_array($type,['png','gif','jpg','jpeg']),ApiException::class,1,'不支持的图像格式');//创建新图像$img=('imagecreatefrom'.$type)($img_src);$质量=75;//图像质量//转换为jpegimagejpeg($img,$save_src,$quality);图片销毁($img);while($file_size>$max_size_limit){$img=imagecreatefromjpeg($save_src);imagejpeg($img,$save_src,--$quality);图片销毁($img);clearstatcache(真,$save_src);//清除文件存档$file_size=filesize($save_src)/1024;如果($quality<=1)中断;}返回intval(文件大小($save_src)/1024);}
