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

PHP使用imagecopyresampled裁剪图片底部20px未生效问题排查

问题原因

你当前代码的核心问题是错误使用了imagecopyresampled的缩放逻辑:你将完整高度的原图整体压缩到了高度减少20px的新画布中,最终效果是图片内容被垂直压扁,自然不会裁剪掉底部20px的内容。

修复方案

因为你的需求只是裁剪没有尺寸缩放需求,推荐两种修改方式:

方案1:调整imagecopyresampled参数

将原图的采样高度修改为和新画布的高度一致,仅读取原图顶部$height - 20的区域,跳过底部20px:

if($mime == 'image/png'){
    $image = imagecreatefrompng($entry);
}else{
    $image = imagecreatefromjpeg($entry);   
}

$dst_x = 0; 
$dst_y = 0;
$src_x = 0;
$src_y = 0;
$new_width = $width; 
$new_height = $height - 20;

$image_p = imagecreatetruecolor($new_width, $new_height);

// 仅修改最后一个参数,原图采样高度和新画布高度一致
imagecopyresampled($image_p, $image, $dst_x, $dst_y, $src_x, $src_y, $new_width, $new_height, $new_width, $new_height);

imagejpeg($image_p, 'crop.jpg', 100);
// 用完释放内存避免资源泄漏
imagedestroy($image);
imagedestroy($image_p);

方案2:直接使用裁剪专用的imagecopy(性能更优)

没有缩放需求时不需要使用重采样函数,直接用imagecopy复制对应区域即可:

if($mime == 'image/png'){
    $image = imagecreatefrompng($entry);
}else{
    $image = imagecreatefromjpeg($entry);   
}

$new_width = $width; 
$new_height = $height - 20;
$image_p = imagecreatetruecolor($new_width, $new_height);

// 直接复制原图顶部对应尺寸的区域
imagecopy($image_p, $image, 0, 0, 0, 0, $new_width, $new_height);

imagejpeg($image_p, 'crop.jpg', 100);
imagedestroy($image);
imagedestroy($image_p);
补充说明

如果后续需要保留PNG的透明通道,还需要额外添加透明通道处理代码,避免透明区域变成黑色:

// 针对PNG的透明通道处理
if($mime == 'image/png'){
    imagealphablending($image_p, false);
    imagesavealpha($image_p, true);
    imagepng($image_p, 'crop.png');
}

内容的提问来源于stack exchange,提问作者TheGreatCornholio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:03:01