函數功能
- 自動偵測圖片類型(JPEG/PNG/GIF)
- 等比例縮放,長邊限制 600px 並再縮 0.9 倍
- GIF 動圖檢測:靜態圖處理,動圖跳過避免幀丟失
- 品質參數 75 平衡體積與清晰度
核心代碼
function check_gif_cartoon($file) {
$fp = fopen($file, 'rb');
$head = fread($fp, 1024);
fclose($fp);
// 檢查 NETSCAPE2.0 標識
return preg_match("/\x21\xff\x0bNETSCAPE2.0/", $head) ? false : true;
}
function compress_image($src, $dst) {
list($w, $h, $type) = getimagesize($src);
$nw = ($w > 600 ? 600 : $w) * 0.9;
$nh = ($h > 600 ? 600 : $h) * 0.9;
switch ($type) {
case IMAGETYPE_GIF:
if (!check_gif_cartoon($src)) break; // 動圖不處理
$srcImg = imagecreatefromgif($src);
$dstImg = imagecreatetruecolor($nw, $nh);
imagecopyresampled($dstImg, $srcImg, 0,0, 0,0, $nw,$nh, $w,$h);
imagejpeg($dstImg, $dst, 75);
break;
case IMAGETYPE_JPEG:
$srcImg = imagecreatefromjpeg($src);
$dstImg = imagecreatetruecolor($nw, $nh);
imagecopyresampled($dstImg, $srcImg, 0,0, 0,0, $nw,$nh, $w,$h);
imagejpeg($dstImg, $dst, 75);
break;
case IMAGETYPE_PNG:
$srcImg = imagecreatefrompng($src);
$dstImg = imagecreatetruecolor($nw, $nh);
// 保留透明度
imagealphablending($dstImg, false);
imagesavealpha($dstImg, true);
imagecopyresampled($dstImg, $srcImg, 0,0, 0,0, $nw,$nh, $w,$h);
imagepng($dstImg, $dst);
break;
}
imagedestroy($dstImg);
imagedestroy($srcImg);
}
GD 圖片函數分類速查
| 分類 | 代表函數 |
| 資訊獲取 | getimagesize、gd_info、imagetypes |
| 建立/載入 | imagecreate、imagecreatetruecolor、imagecreatefromjpeg/png/gif/webp |
| 輸出 | imagejpeg、imagepng、imagegif、imagewebp、imagewbmp |
| 複製/縮放 | imagecopy、imagecopyresampled、imagecopyresized、imagescale |
| 繪圖 | imageline、imagerectangle、imageellipse、imagepolygon、imagettftext |
| 顏色/透明 | imagecolorallocate、imagecolortransparent、imagesavealpha、imagealphablending |
| 濾鏡/效果 | imagefilter、imageflip、imageconvolution |
| 資源釋放 | imagedestroy |
進階建議
- PNG 透明度處理需
imagealphablending(false) + imagesavealpha(true)
- 大量處理建議使用
Imagick 擴充,效能與功能更強
- 上傳前驗證 MIME、副檔名、檔案大小,防惡意檔案