上傳圖片後生成縮略圖是常見需求,關鍵在於「等比縮放」——保持寬高比,在指定最大尺寸框內完整顯示。本文提供生產級可用函數。
getimagesize()min($maxWidth/$width, $maxHeight/$height)imagecreatetruecolor()imagecopyresampled()imagejpeg/png/gif()<?php
/**
* 等比縮放生成縮略圖
* @param string $srcImage 源圖片路徑
* @param string $toFile 目標文件路徑(不含擴展名)
* @param int $maxWidth 最大寬度
* @param int $maxHeight 最大高度
* @param int $quality 圖片質量 1-100
* @return string|false 成功返回文件名,失敗返回 false
*/
function resizeImage($srcImage, $toFile, $maxWidth = 100, $maxHeight = 100, $quality = 90) {
if (!file_exists($srcImage)) return false;
list($width, $height, $type) = getimagesize($srcImage);
if ($width <= $maxWidth && $height <= $maxHeight) return false; // 無需縮放
// 計算縮放比例
$scale = min($maxWidth / $width, $maxHeight / $height);
$newWidth = (int)($width * $scale);
$newHeight = (int)($height * $scale);
// 載入源圖
switch ($type) {
case IMAGETYPE_GIF: $src = imagecreatefromgif($srcImage); break;
case IMAGETYPE_JPEG: $src = imagecreatefromjpeg($srcImage); break;
case IMAGETYPE_PNG: $src = imagecreatefrompng($srcImage); break;
default: return false;
}
// 創建目標畫布
$dst = imagecreatetruecolor($newWidth, $newHeight);
// PNG/GIF 保持透明度
if ($type === IMAGETYPE_PNG || $type === IMAGETYPE_GIF) {
imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
imagealphablending($dst, false);
imagesavealpha($dst, true);
}
// 高質量重採樣
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// 輸出文件
$ext = ['', 'gif', 'jpg', 'png'][$type];
$targetFile = $toFile . '.' . $ext;
$result = false;
switch ($type) {
case IMAGETYPE_GIF: $result = imagegif($dst, $targetFile); break;
case IMAGETYPE_JPEG: $result = imagejpeg($dst, $targetFile, $quality); break;
case IMAGETYPE_PNG: $result = imagepng($dst, $targetFile, (int)($quality/10)); break;
}
// 清理資源
imagedestroy($src);
imagedestroy($dst);
return $result ? basename($targetFile) : false;
}
$thumb = resizeImage(
'uploads/photo.jpg', // 源文件
'thumbs/photo', // 目標路徑(不含擴展名)
300, 200, // 最大 300x200
85 // JPEG 質量 85%
);
if ($thumb) {
echo "縮略圖生成成功:$thumb";
}
scale_fill 模式:縮放填滿並居中,空白處填充背景色crop 模式:智能裁剪居中區域(適合頭像)memory_limit 或分塊處理imagesavealpha 和 imagealphablending這個函數經過實戰驗證,代碼簡潔、邏輯清晰,可直接集成到項目中使用。