天天看點

解決阿裡雲圖檔超過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軟體無損放大,目測全國僅此一家(收費)。