天天看点

解决阿里云图片超过20M无法缩放的问题

如题,oss在处理图片时能力不足日益显现,高清无损放大他们办不到,超标图片缩小也办不到。可惜了。目前公司的业务范围为: 每天上传几千张图片,储存量每天几10+个G,买的下行流量2TB每月、每张图片10M-40M左右,像素1200px-30000PX之间,在系统中有时只需要一个缩略图,在处理时经常遇到阿里云的BUG卡脖子。

当上传至阿里云的图片为32M 时,虽然可以上传成功,但使用阿里云的插件 ,例如缩小到50%,在图片后面追加?x-oss-process=image/resize,p_50会报一个错误:Maximal size of image supported is 20971520

原因是阿里云不处理超过20M 以上的图片,fuuuuuuuuuckAliyun,那么我们需要在上传图片之前进行限制:

在安装了php扩展imagick 的条件下,执行以下代码:

方法一:无损级降低图片大小尺寸 ,将10000以上像素的图片无损降低到1000像素以内。

$src_img = 'D:\phpstudy_pro\WWW\api.321.design\f57ce202009151149386590.jpg';
 $ai = new \Imagick($src_img);
 $ai->thumbnailImage(1200,1200);#如果给定第三个参数true 的话则按最大边1200处理
 $path = ROOT_PATH. "99999.png";
 $ai->writeImage($path);
 d($path);
           

方法二:无损级降低图片质量 将20M以上的图片无损 降低到1M左右

/**
* $src_img 本地文件
* $quality 压缩数值,按100比
*/
 function reduceQuality($src_img, $quality = 70, $dest_img = '')
    {
        $imagick = new \Imagick();
        $dest_img = ROOT_PATH . '8888.jpg';
        $imagick->readImage($src_img);
        $imagick->setImageCompression(\Imagick::COMPRESSION_JPEG);
        $imagick->setImageCompressionQuality($quality);
        $imagick->writeImage($dest_img);
        return $dest_img;


    }
           

如果既要降低尺寸又要降低质量可以两个方法同时调用。

/**
     * @param $src_img
     * @return string
     * @throws \ImagickException
     */
    protected static function reduceSize($src_img)
    {
        $ai = new \Imagick($src_img);
        $ai->thumbnailImage(300, 300, true);#如果给定第三个参数true 的话则按最大边300处理
        $path = ROOT_PATH . str_shuffle(md5(time())) . '.jpg';
        $ai->writeImage($path);
        $path = self::reduceQuality($path);

        return $path;

    }

    /**
     * @param $src_img
     * @param int $quality
     * @param string $dest_img
     * @return string
     * @throws \ImagickException
     */
    protected static function reduceQuality($src_img, $quality = 70, $dest_img = '')
    {
        if (!$dest_img) {
            $dest_img = $src_img;
        }
        $imagick = new \Imagick();
        $imagick->readImage($src_img);
        $imagick->setImageCompression(\Imagick::COMPRESSION_JPEG);
        $imagick->setImageCompressionQuality($quality);
        $imagick->writeImage($dest_img);
        return $dest_img;
    }

           

经过比对,压缩后的图片清晰度不会丢失。我们刚尝试了一张阿里云图片32M压缩到12M 的例子。当图片达到20M以下时就可以使用阿里云的图片限定插件了。

例如:

将原图:

(按宽500等比例缩放)

http://img.321.design/gallery/f9be8202010260903458884.jpg?x-oss-process=image/resize,w_500

(按最大边500等比例缩放)

http://img.321.design/gallery/f9be8202010260903458884.jpg?x-oss-process=image/resize,l_500

(按图片放大多少倍,以下为原图500像素放大3.2倍的两种方式):?x-oss-process=image/resize,p_320 或者

?x-oss-process=image/resize,w_1600,limit_0 放大图片就不要用阿里云了,可以用bigjpg软件无损放大,目测全国仅此一家(收费)。