壓縮圖片 待驗證

 

 

    
    /**
     * @desc 壓縮圖片
     * @param string $src 圖片源地址(全路徑)
     * @param int $dst_w 目標寬度
     * @param int $dst_h 目標高度
     * @param string $dst 目標地址(全路徑) 若是指定,則把縮放後的圖片直接寫入到$dst指定的路徑;不然則返回圖片的二進制值
     * @param boolean $isHold 是否鎖定原圖的高寬比。若是false(不鎖定),則嚴格按照指定的$dst_w和$dst_h生成新的圖片
     * @param string $format 縮放後圖片的格式。若是不指定,則使用原圖的格式
     * @return InternalResultTransfer
     */
    static function compress($src, $dst_w, $dst_h, $dst = null, $isHold = false, $format = null) {        
        if (empty($src)) {
            return ResultWrapper::fail("請指定原圖");
        }
        if (!file_exists($src)) {
            return ResultWrapper::fail("{$src} 該圖片文件不存在");
        }
        
        $objImagick = new \Imagick();
        $objImagick ->readImage($src);
        if ($isHold) {
            $src_h = $objImagick->getImageHeight();
            $src_w = $objImagick->getImageWidth();
            /// 源圖片比目標圖片要小
            if ($src_w < $dst_w && $src_h < $dst_h) {
                $hratio = $dst_h / $src_h;
                $wratio = $dst_w / $src_w;
                $ratio = $hratio < $wratio ? $hratio : $wratio;
                $dst_h = $src_h * $ratio;
                $dst_w = $src_w * $ratio;
                $isHold = false;
            }
        }
        $objImagick->resizeImage($dst_w, $dst_h, \Imagick::FILTER_CATROM, 1, $isHold);

        if (is_null($format)) {
            $format = $objImagick->getImageFormat();
        }
        $objImagick->setImageFormat($format);
        // 壓縮
        $objImagick->setImageCompression(\Imagick::COMPRESSION_JPEG);
        $a = $objImagick->getImageCompressionQuality() * 0.75;
        if ($a == 0) {
            $a = 75;
        }
        $objImagick->setImageCompressionQuality($a);
        $objImagick->stripImage(); // Strips an image of all profiles and comments
        
        if (is_null($dst)) {// 返回圖像內容
            $data = $objImagick->getImageBlob();
            $ret = ResultWrapper::success($data);
        } else {
            $tmpWriteResult = $objImagick->writeImage($dst);
            if ($tmpWriteResult) {
                $ret = ResultWrapper::success(array(
                    'w' => $objImagick->getImageWidth(),
                    'h' => $objImagick->getImageHeight(),
                ));
            } else {
                $ret = ResultWrapper::fail("寫入目標地址失敗");
            }
        }
        $objImagick->clear(); // Clears all resources associated to Imagick object
        $objImagick->destroy();
        return $ret;
    }
相關文章
相關標籤/搜索