在 Web 開發中,圖片縮略圖的生成是常見需求。本文介紹一個基於 PHP GD 庫封裝的 image 類,提供兩種核心功能:等比縮放 與 等比裁剪縮略圖,適用於頭像、商品圖等場景。
<?php
require_once 'image.class.php';
$img = new image();
// 等比縮放:目標 300x400,源圖完整縮放
$img->resize('dstimg.jpg', 'srcimg.jpg', 300, 400);
// 等比裁剪縮略圖:目標 300x300,居中裁剪
$img->thumb('dstimg.jpg', 'srcimg.jpg', 300, 300);
?>
<?php
class image {
// 等比縮放
public function resize($dstImg, $srcImg, $dstW, $dstH) {
list($srcW, $srcH) = getimagesize($srcImg);
$scale = min($dstW / $srcW, $dstH / $srcH);
$newW = round($srcW * $scale);
$newH = round($srcH * $scale);
$newImg = imagecreatetruecolor($newW, $newH);
$srcImgRes = imagecreatefromjpeg($srcImg);
imagecopyresampled($newImg, $srcImgRes, 0, 0, 0, 0, $newW, $newH, $srcW, $srcH);
imagejpeg($newImg, $dstImg);
}
// 等比裁剪縮略圖
public function thumb($dstImg, $srcImg, $dstW, $dstH) {
list($srcW, $srcH) = getimagesize($srcImg);
$scale = max($dstW / $srcW, $dstH / $srcH);
$newW = round($dstW / $scale);
$newH = round($dstH / $scale);
$x = ($srcW - $newW) / 2;
$y = ($srcH - $newH) / 2;
$newImg = imagecreatetruecolor($dstW, $dstH);
$srcImgRes = imagecreatefromjpeg($srcImg);
imagecopyresampled($newImg, $srcImgRes, 0, 0, $x, $y, $dstW, $dstH, $newW, $newH);
imagejpeg($newImg, $dstImg);
}
}
?>
以上代碼僅支持 JPEG。實際項目中需根據 MIME 類型動態調用對應的 imagecreatefrom* 函數:
function createFromType($type, $srcImg) {
$function = "imagecreatefrom$type";
return $function($srcImg);
}
// 使用示例
$mime = mime_content_type($srcImg); // 如 image/png, image/gif
$type = substr($mime, 6); // png, gif, jpeg
$srcRes = createFromType($type, $srcImg);
若服務器安裝了 ImageMagick 擴展,強烈建議改用 Imagick 類。只需兩行代碼即可實現上述所有功能,且支持更多格式、性能更優、API 更豐富:
$imagick = new Imagick('srcimg.jpg');
$imagick->thumbnailImage(300, 400, true, true); // 等比縮放
$imagick->writeImage('dstimg.jpg');
本類為 GD 庫底層操作的輕量封裝,適合無法安裝擴展的環境。生產環境推薦使用 Imagick 或成熟庫(如 Intervention Image),獲得更好的異常處理、格式支持與維護性。