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; } }