美文网首页
PHP 压缩图片

PHP 压缩图片

作者: killtl | 来源:发表于2019-03-15 14:06 被阅读0次

    背景

    弱网情况下,用户上传的高清大图在前端展示可能白板,需要在用户上传的时候进行实时的压缩,只能压缩清晰度,不能进行宽高裁剪

    第一种方法

    使用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值越小,清晰度越低

    相关文章

      网友评论

          本文标题:PHP 压缩图片

          本文链接:https://www.haomeiwen.com/subject/rrmlmqtx.html