You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:15:03