PHP GD库可用imagecopyresampled()实现精确裁剪,需先加载源图资源、创建目标画布,注意坐标原点、图像类型、EXIF旋转校正及内存管理。

PHP 自带的 GD 库就能完成基础图片裁剪,无需额外扩展,但必须注意图像资源类型、坐标原点和内存管理。
用 imagecopyresampled() 实现精确裁剪
这是最常用也最可控的方式,适合按指定坐标+宽高从原图抠出一块区域并缩放到目标尺寸(或保持原尺寸)。
- 源图需先用
imagecreatefromjpeg()/imagecreatefrompng()等加载为资源,不能直接操作文件路径 - 目标画布要用
imagecreatetruecolor()创建,尺寸即你想要的裁剪后大小 -
imagecopyresampled($dst, $src, 0, 0, $x, $y, $dst_w, $dst_h, $src_w, $src_h)中的$x和$y是源图上的起始坐标(左上角),不是屏幕像素,也不是百分比 - 若只裁剪不缩放,令
$dst_w === $src_w且$dst_h === $src_h,但要注意$x + $src_w和$y + $src_h不能超出原图边界,否则结果为空白或报错
[$src = imagecreatefromjpeg('photo.jpg');
$dst = imagecreatetruecolor(200, 150);
imagecopyresampled($dst, $src, 0, 0, 50, 30, 200, 150, 200, 150);
imagejpeg($dst, 'crop.jpg', 90);
imagedestroy($src);
imagedestroy($dst);]
裁剪前必须检查图像类型和尺寸
GD 不支持 WebP(PHP 7.4+ 才有 imagecreatefromwebp),且 getimagesize() 返回的宽高可能和实际加载后不一致(比如旋转信息未被 GD 自动处理)。
- 用
getimagesize()获取原始宽高和类型,再选对应加载函数;否则imagecreatefrompng()加载 JPEG 会失败 - 调用
exif_read_data()判断是否含旋转标记(如 iPhone 拍照),必要时先用imagerotate()校正,否则裁剪区域偏移 - GD 对 GIF 动画只处理第一帧,裁剪后丢失动画,需用 Imagick 或第三方库处理动图
避免常见内存与权限错误
大图裁剪容易触发 Allowed memory size exhausted 或 Cannot allocate memory,尤其在共享主机上。
立即学习“PHP免费学习笔记(深入)”;
- 在裁剪前加
ini_set('memory_limit', '256M'),但更稳妥的是先用imagescale($src, $max_width, $max_height, IMG_BILINEAR)缩小原图再裁剪 - 确保 PHP 有读取源图、写入目标路径的权限;
imagejpeg()第二个参数为null时直接输出到浏览器,此时必须清空输出缓冲并设置header('Content-Type: image/jpeg') - 忘记
imagedestroy()会导致内存持续占用,循环批量处理时极易崩溃
真正麻烦的不是裁剪动作本身,而是源图格式杂、EXIF 旋转未归一、内存限制硬卡住——这些细节不提前兜底,代码上线后往往只在特定用户上传的某张照片上突然失效。











