在PHP开发中,图片尺寸调整是上传功能里的常见需求,调整时还要保持原有比例避免图片拉伸变形,下面介绍两种常用的实现方案。

方案一:使用GD库调整图片尺寸
GD库是PHP内置的图片处理扩展,大部分环境默认开启,适合轻量级的图片处理需求。核心思路是先获取原图尺寸,计算等比例缩放后的目标尺寸,再通过重采样函数生成新图。
比例保持的计算逻辑
如果只给定目标宽度,高度需要按照原图宽高比计算:目标高度 = 原图高度 * (目标宽度 / 原图宽度)。如果同时给定宽高,需要判断哪个缩放比例更小,优先按更小的比例缩放,保证图片完整放入目标区域且不拉伸。
GD库实现代码示例
<?php
/**
* 使用GD库调整图片尺寸并保持比例
* @param string $srcPath 原图路径
* @param string $destPath 新图保存路径
* @param int $targetWidth 目标宽度
* @param int $targetHeight 目标高度,0表示按宽度等比缩放
* @return bool 是否调整成功
*/
function resizeImageWithGD($srcPath, $destPath, $targetWidth, $targetHeight = 0) {
// 获取原图信息
$imgInfo = getimagesize($srcPath);
if (!$imgInfo) {
return false;
}
$srcWidth = $imgInfo[0];
$srcHeight = $imgInfo[1];
$mime = $imgInfo['mime'];
// 根据原图类型创建画布
switch ($mime) {
case 'image/jpeg':
$srcImg = imagecreatefromjpeg($srcPath);
break;
case 'image/png':
$srcImg = imagecreatefrompng($srcPath);
break;
case 'image/gif':
$srcImg = imagecreatefromgif($srcPath);
break;
default:
return false;
}
// 计算目标尺寸,保持比例
if ($targetHeight == 0) {
// 仅指定宽度,按宽度等比缩放
$targetHeight = $srcHeight * ($targetWidth / $srcWidth);
} else {
// 同时指定宽高,按最小缩放比例计算,避免超出
$widthRatio = $targetWidth / $srcWidth;
$heightRatio = $targetHeight / $srcHeight;
$ratio = min($widthRatio, $heightRatio);
$targetWidth = $srcWidth * $ratio;
$targetHeight = $srcHeight * $ratio;
}
// 创建目标画布
$destImg = imagecreatetruecolor($targetWidth, $targetHeight);
// 处理png图片透明背景
if ($mime == 'image/png') {
imagecolortransparent($destImg, imagecolorallocatealpha($destImg, 0, 0, 0, 127));
imagealphablending($destImg, false);
imagesavealpha($destImg, true);
}
// 重采样复制图片,保持画质
imagecopyresampled($destImg, $srcImg, 0, 0, 0, 0, $targetWidth, $targetHeight, $srcWidth, $srcHeight);
// 保存图片
switch ($mime) {
case 'image/jpeg':
imagejpeg($destImg, $destPath, 90);
break;
case 'image/png':
imagepng($destImg, $destPath);
break;
case 'image/gif':
imagegif($destImg, $destPath);
break;
}
// 释放资源
imagedestroy($srcImg);
imagedestroy($destImg);
return true;
}
// 调用示例:将原图调整为宽度800,高度等比缩放
resizeImageWithGD('source.jpg', 'new_source.jpg', 800);
?>方案二:使用ImageMagick扩展调整图片尺寸
ImageMagick是功能更强大的图片处理扩展,支持更多图片格式,处理大尺寸图片的效率更高,缩放算法的画质也更好。它的resizeImage方法可以直接指定保持比例的参数。
ImageMagick实现代码示例
<?php
/**
* 使用ImageMagick调整图片尺寸并保持比例
* @param string $srcPath 原图路径
* @param string $destPath 新图保存路径
* @param int $targetWidth 目标宽度
* @param int $targetHeight 目标高度,0表示按宽度等比缩放
* @return bool 是否调整成功
*/
function resizeImageWithImagick($srcPath, $destPath, $targetWidth, $targetHeight = 0) {
try {
$imagick = new Imagick($srcPath);
// 获取原图尺寸
$srcWidth = $imagick->getImageWidth();
$srcHeight = $imagick->getImageHeight();
// 计算目标尺寸,保持比例
if ($targetHeight == 0) {
$targetHeight = $srcHeight * ($targetWidth / $srcWidth);
} else {
$widthRatio = $targetWidth / $srcWidth;
$heightRatio = $targetHeight / $srcHeight;
$ratio = min($widthRatio, $heightRatio);
$targetWidth = $srcWidth * $ratio;
$targetHeight = $srcHeight * $ratio;
}
// 调整尺寸,第三个参数表示是否保持比例,这里设为true
$imagick->resizeImage($targetWidth, $targetHeight, Imagick::FILTER_LANCZOS, 1, true);
// 保存图片
$imagick->writeImage($destPath);
$imagick->clear();
$imagick->destroy();
return true;
} catch (Exception $e) {
return false;
}
}
// 调用示例:将原图调整为宽度800,高度等比缩放
resizeImageWithImagick('source.jpg', 'new_source_imagick.jpg', 800);
?>两种方案的选择建议
- 如果项目环境没有安装ImageMagick,或者只是简单的图片尺寸调整需求,优先选择GD库方案,无需额外安装扩展。
- 如果需要处理大量图片、大尺寸图片,或者对输出画质有更高要求,建议选择ImageMagick方案,处理效率和画质都更优。
- 无论选择哪种方案,都要注意计算缩放比例时取较小的缩放系数,避免图片超出目标尺寸范围,同时保证原图比例不变。
PHP图片尺寸调整GD库ImageMagick比例保持修改时间:2026-05-28 16:06:24