如何修改PHP图片缩放代码实现保持宽高比调整尺寸避免拉伸
实现方案
该需求完全可以实现,核心逻辑是:计算原图宽高和目标宽高的两个缩放比例,取较小值作为实际缩放比例,保证缩放后的图片完全适配目标画布且不会拉伸变形,多余的空白区域可按图片类型填充透明背景(PNG)或白色背景(JPG),同时将缩放后的图片在目标画布居中放置。
修改后的完整代码如下:
function resize_img($file,$width,$height=null){ $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); // 统一转小写避免后缀大写识别失败 // 校验图片类型 if(!in_array($ext, ['jpg','jpeg','png'])){ return false; // 不支持的格式直接返回 } // 创建原图资源 if($ext=='jpg' || $ext=='jpeg'){ $img = imagecreatefromjpeg($file); } else if($ext=='png'){ $img = imagecreatefrompng($file); } // 获取原图宽高 $img_w = imagesx($img); $img_h = imagesy($img); // 未传高度时默认按宽度等比缩放,兼容原有逻辑 if(is_null($height)){ $ratio = $width / $img_w; $new_w = $width; $new_h = $img_h * $ratio; $canvas_w = $new_w; $canvas_h = $new_h; }else{ // 同时传宽高时计算缩放比例,取较小值保证图片完全适配且不变形 $ratio_w = $width / $img_w; $ratio_h = $height / $img_h; $ratio = min($ratio_w, $ratio_h); // 计算实际缩放后的图片宽高 $new_w = intval($img_w * $ratio); $new_h = intval($img_h * $ratio); // 画布宽高用传入的自定义宽高 $canvas_w = $width; $canvas_h = $height; } // 创建画布 $new_img = imagecreatetruecolor($canvas_w, $canvas_h); // 处理PNG透明背景 if($ext == 'png'){ imagealphablending($new_img, false); imagesavealpha($new_img, true); $transparent = imagecolorallocatealpha($new_img, 255, 255, 255, 127); imagefill($new_img, 0, 0, $transparent); }else{ // JPG填充白色背景 $white = imagecolorallocate($new_img, 255, 255, 255); imagefill($new_img, 0, 0, $white); } // 计算图片在画布上的居中偏移量 $offset_x = intval(($canvas_w - $new_w) / 2); $offset_y = intval(($canvas_h - $new_h) / 2); // 重采样生成图片 imagecopyresampled($new_img, $img, $offset_x, $offset_y, 0, 0, $new_w, $new_h, $img_w, $img_h); // 输出保存图片 if($ext=='jpg' || $ext=='jpeg'){ imagejpeg($new_img, $file, 82); } else if($ext=='png'){ imagepng($new_img, $file); } // 销毁资源释放内存 imagedestroy($img); imagedestroy($new_img); return true; }
核心修改点说明
- 新增双比例计算逻辑:同时传入宽高时分别计算宽、高方向的缩放比例,取最小值作为实际缩放比例,保证图片不会超出目标尺寸且完全保留原始比例
- 新增画布背景适配:PNG保留透明背景,JPG填充白色背景,避免出现黑边问题
- 新增居中偏移计算:缩放后的图片自动居中放在目标画布上,适配不同比例的原图和目标尺寸
- 新增后缀大小写兼容、内存释放逻辑,提升代码稳定性
- 完全兼容原有调用逻辑:只传宽度时和原有代码效果完全一致,不会影响旧代码调用
内容的提问来源于stack exchange,提问作者test
相关产品推荐
相关产品推荐

