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
相关产品推荐
相关产品推荐

