天天看點

Linux環境—JPEG/JPG/PNG圖檔轉換WEBP格式(二)

PHP源碼編寫

<?php ini_set('display_errors',1); class imagick_convert {     //原始圖檔絕對路徑     private $str_old_file = '';     //轉換webp預設擴充名     private $str_default_ext = 'webp';     //支援轉換的圖檔格式     private $arr_image_ext = null;

         public function __construct($str_image_path)     {         $this->str_old_file = $str_image_path;     }

         public function convert_transform_images($webp_dir = '')     {         //檔案是否存在         if(!is_file($this->str_old_file))         {                //WEBP格式轉換:待轉換的圖檔路徑不正确             return $this->str_old_file;         }         //圖檔基本資訊         $ext = pathinfo($this->str_old_file,PATHINFO_EXTENSION);         $ext = empty($ext) ? '' : strtolower($ext);         //圖檔品質         $this->arr_image_ext = array(             'jpeg' => Imagick::COMPRESSION_JPEG,             'jpg'  => Imagick::COMPRESSION_JPEG,             'png'  => Imagick::COMPRESSION_UNDEFINED,         );         //根據字尾名把jpg或者png轉成webp         if(!in_array($ext, array_keys($this->arr_image_ext)))         {                //WEBP格式轉換:暫不支援該格式轉換,目前僅支援轉換 jpeg,jpg和png 格式             return $this->str_old_file;         }         //預設webp圖檔新路徑         if(empty($webp_dir))         {             $webp_dir = rtrim($this->str_old_file,$ext) . $this->str_default_ext;         }         //開始轉換         try         {             //原圖的品質             $new_q = $this->get_img_quality($ext);             //轉換成webp格式             $this->do_jpg_transform_webp($webp_dir, $new_q);         }         catch(Exception $e)         {                //WEBP格式轉換:工具轉換異常,切換至GD庫轉換             $webp_dir = $this->php_gd_image_webp($ext,$webp_dir);         }         //睡眠0.2秒         usleep(20000);         if(is_file($webp_dir))         {                //删除原始圖檔 + 設定WEBP圖檔通路權限             chmod($webp_dir, 0777);             unlink($this->str_old_file);                //WEBP格式轉換:轉換成功             return $webp_dir;         }           //WEBP格式轉換:轉換失敗,傳回原始圖檔路徑         return $this->str_old_file;     }

         private function get_img_quality($str_ext)     {         $resource = new Imagick($this->str_old_file);         //png特殊處理         if($str_ext == 'png')         {             $resource->setImageFormat('PNG');         }         $resource->setImageCompression($this->arr_image_ext[$str_ext]);         $current = $resource->getImageCompressionQuality();         $resource->clear();         $resource->destroy();         if(!isset($current) || empty($current))         {             $current = 80;         }         $resource->clear();         $resource->destroy();         return $current;     }

         private function do_jpg_transform_webp($webp_img_path, $int_q = 80)     {         exec("cwebp -q {$int_q} {$this->str_old_file} -o {$webp_img_path}");     }

         private function php_gd_image_webp($ext,$webp_img_path)     {         //jpg處理使用jpeg         $ext = $ext == 'jpg' ? 'jpeg' : $ext;         //拼接函數名 imagecreatefromjpeg 還是 imagecreatefrompng         $funName = 'imagecreatefrom' . $ext;         //開始轉換         $obj_img = null;         try         {             //打開這個圖檔資源             $obj_img = $funName($this->str_old_file);             //用這個圖檔資源建立一個webp圖檔, 存在路徑$tdir             imagewebp($obj_img,$webp_img_path);         }         catch(Exception $e)         {

        }         //銷毀畫布資源         if($obj_img != null)         {             imagedestroy($obj_img);         }         //睡眠0.3秒         return $webp_img_path;     } }