背景
弱网情况下,用户上传的高清大图在前端展示可能白板,需要在用户上传的时候进行实时的压缩,只能压缩清晰度,不能进行宽高裁剪
第一种方法
使用php 的GD 库进行压缩,样例代码如下
$source = '/tmp/pic';
$image = imagecreatefromjpeg($source); // 加载资源
if (isset($image) && is_resource($image)) {
imagejpeg($image, $destination, $quality); // 根据$quality比例进行
imagedestroy($image);
}
实际运行发现,该方式非常吃内存,一张图片小200M就吃光了,不适用于实时处理,异步队列根据内存大小多进程顺序处理倒是可行,所以这种方法pass掉
第二种方法
使用php 的ImageMagick扩展进行压缩,该方式比较麻烦的地方是需要安装ImageMagick底层库和imagick扩展,centos操作系统安装可以参考https://www.linuxhelp.com/install-imagemagick-image-manipulation-tool-rhelcentos-fedora ,样例代码如下
$source = '/tmp/pic';
$image = new \Imagick($source);
$image->setImageFormat('jpg'); // 统一格式化成jpg格式,不然png图片压缩无效果
$image->setImageCompressionQuality($quality); // 根据$quality比例进行
$image->writeImage($destination);
$image->clear(); // 这一步需要执行,不然可能造成内存泄漏
该方式解决了占用内存过大的问题,平均使用2M左右,但是耗时相对长一点,这点还是可以接受的,关于imagick的使用说明,可以参考这里https://phpimagick.com/Imagick
注意
以上方法的$quality
只是清晰度压缩比例,通过设置该值可以达到降低图片大小的目的,但是该值不能用来准确预判压缩后的图片大小,这个只能根据场景进行量测然后得出合理值,我这边的实际使用的规则是1-5M $quality=50 5-10M $quality=30 $quality
值越小,清晰度越低
网友评论