本文目录导读:

在PHP中处理图片裁剪,常用的函数取决于你使用的扩展库,主要有 GD库 和 Imagick 两种。
以下是具体的函数和用法:
使用 GD 库(最常用,默认开启)
GD库是PHP的标准扩展,几乎所有的虚拟主机都支持。
核心函数: imagecrop()
这是PHP 5.5+ 提供的最直接的裁剪函数,如果版本较老(PHP < 5.5),则需要使用 imagecopyresampled() 或 imagecopy() 结合 imagecreatetruecolor() 来实现。
方法 A:使用 imagecrop() (推荐,PHP 5.5+)
<?php
// 1. 创建图像资源
$src = imagecreatefromjpeg('source.jpg'); // 支持 jpeg, png, gif 等
// 2. 定义裁剪区域
$crop = [
'x' => 100, // 裁剪区域左上角 X 坐标
'y' => 50, // 裁剪区域左上角 Y 坐标
'width' => 200, // 裁剪宽度
'height' => 150 // 裁剪高度
];
// 3. 执行裁剪
$cropped = imagecrop($src, $crop);
// 4. 输出或保存
header('Content-Type: image/jpeg');
imagejpeg($cropped, 'cropped.jpg'); // 保存为新文件
// 5. 释放内存
imagedestroy($src);
imagedestroy($cropped);
?>
方法 B:使用 imagecopyresampled() (兼容性最好,支持缩放裁剪)
如果你需要“缩放后裁剪”或兼容老版本PHP,使用这个方法,这个方法也是实现“居中裁剪头像”的经典方法。
<?php
function cropImage($sourcePath, $targetPath, $targetWidth, $targetHeight) {
// 获取原图信息
list($srcWidth, $srcHeight, $type) = getimagesize($sourcePath);
// 根据类型创建原图资源
switch ($type) {
case IMAGETYPE_JPEG: $src = imagecreatefromjpeg($sourcePath); break;
case IMAGETYPE_PNG: $src = imagecreatefrompng($sourcePath); break;
case IMAGETYPE_GIF: $src = imagecreatefromgif($sourcePath); break;
default: return false;
}
// 计算裁剪坐标(这里示例:从中心点裁剪)
$srcX = max(0, ($srcWidth - $targetWidth) / 2); // 居中裁剪 X
$srcY = max(0, ($srcHeight - $targetHeight) / 2); // 居中裁剪 Y
// 创建目标画布(空白画布)
$dst = imagecreatetruecolor($targetWidth, $targetHeight);
// 保留透明背景(如果是PNG)
imagealphablending($dst, false);
imagesavealpha($dst, true);
// 执行裁剪并缩放(如果原图小于目标尺寸,会自动放大)
imagecopyresampled(
$dst, // 目标画布
$src, // 源图
0, 0, // 目标X, 目标Y
$srcX, $srcY, // 源图裁剪起点X, Y
$targetWidth, $targetHeight, // 目标宽高
$targetWidth, $targetHeight // 从源图截取的实际宽高(这里取目标大小,如果越界则用上面的max限制)
);
// 保存图片
switch ($type) {
case IMAGETYPE_JPEG: imagejpeg($dst, $targetPath, 90); break;
case IMAGETYPE_PNG: imagepng($dst, $targetPath); break;
case IMAGETYPE_GIF: imagegif($dst, $targetPath); break;
}
imagedestroy($src);
imagedestroy($dst);
return true;
}
// 调用示例:将图片居中裁剪为 300x300
cropImage('originals/avatar.jpg', 'cache/avatar_300.jpg', 300, 300);
?>
使用 Imagick 扩展(功能更强大,支持更多格式)
Imagick 是基于 ImageMagick 的扩展,处理大型图片或复杂操作性能更好,功能更丰富。
核心方法: cropImage() 或 cropThumbnailImage()
方法 A:使用 cropImage() (精确裁剪)
<?php
$imagick = new \Imagick('source.jpg');
// 参数顺序:宽度, 高度, X坐标, Y坐标
$imagick->cropImage(200, 100, 50, 50);
// 输出到浏览器
header('Content-Type: image/jpeg');
echo $imagick->getImageBlob();
// 或者保存到文件
$imagick->writeImage('cropped.jpg');
$imagick->clear();
?>
方法 B:使用 cropThumbnailImage() (居中裁剪 + 缩放,最方便)
这个方法非常适合生成缩略图,它会自动居中裁剪并缩放至指定尺寸。
<?php
$imagick = new \Imagick('large_photo.jpg');
// 自动居中裁剪并缩放为 200x200
$imagick->cropThumbnailImage(200, 200);
$imagick->writeImage('thumbnail.jpg');
$imagick->clear();
?>
总结建议
| 场景 | 推荐方案 |
|---|---|
| 标准虚拟主机,无特殊扩展 | 使用 GD库 的 imagecrop()(PHP 5.5+) |
| 需要精细控制,兼容旧版本 | 使用 GD库 的 imagecopyresampled() |
| 高并发/大型图片处理 | 使用 Imagick 的 cropThumbnailImage() |
| 生成二维码/头像裁剪 | 通常用 imagecopyresampled() 或 cropThumbnailImage() 实现居中裁剪 |
注意: 如果使用 GD 库的 imagecrop() 处理 PNG 图片,务必记得先调用 imagealphablending($image, false) 和 imagesavealpha($image, true) 来保留透明通道,否则裁剪出来的图片会带有黑色背景。