PHP图像处理:调整尺寸与裁剪(resize, crop)
图像处理是Web应用开发中最常见的任务之一。头像上传、缩略图生成、适配不同屏幕分辨率的图片调整——所有这些都需要调整尺寸(resize)和裁剪(crop)。在PHP中,有两个主要工具可用于此目的:内置扩展GD和更强大的Imagick库。本文将结合实际示例,对这两种方法进行讲解。
1. GD扩展(标准工具)
GD是最流行且最易用的图像处理扩展。它内置于大多数PHP发行版中,无需额外安装。GD支持主要格式:JPEG、PNG、GIF、WebP。
1.1. 保持比例的尺寸调整(resize)
经典任务是将大图缩小到指定宽度,同时保持宽高比。以下是一个将图片缩放到指定宽度的函数示例。
<?phpfunction resizeImage($srcFile, $destFile, $newWidth) { // 获取原始图像信息 list($width, $height, $type) = getimagesize($srcFile);
// 按比例计算新高度 $ratio = $width / $height; $newHeight = $newWidth / $ratio;
// 为新图像创建画布 $srcImage = imagecreatefromjpeg($srcFile); // 针对JPEG $destImage = imagecreatetruecolor($newWidth, $newHeight);
// 复制并缩放 imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// 保存结果 imagejpeg($destImage, $destFile, 90); // 质量90%
// 释放内存 imagedestroy($srcImage); imagedestroy($destImage);}
// 使用示例resizeImage('photo.jpg', 'photo_thumb.jpg', 300);?>处理PNG或GIF时,需要使用imagecreatefrompng()和imagecreatefromgif()函数,并通过imagepng()或imagegif()保存。
1.2. 居中裁剪图像(crop)
通常不仅需要缩小,还需要从图像中心裁剪出一个正方形区域。这称为居中裁剪。
<?phpfunction cropCenter($srcFile, $destFile, $cropSize) { list($width, $height, $type) = getimagesize($srcFile);
// 确定从中心裁剪正方形的坐标 $srcX = ($width - $cropSize) / 2; $srcY = ($height - $cropSize) / 2;
// 如果图像小于所需尺寸,则直接缩放 if ($width < $cropSize || $height < $cropSize) { $ratio = min($cropSize / $width, $cropSize / $height); $newWidth = $width * $ratio; $newHeight = $height * $ratio; $srcImage = imagecreatefromjpeg($srcFile); $destImage = imagecreatetruecolor($cropSize, $cropSize); // 填充白色背景 $white = imagecolorallocate($destImage, 255, 255, 255); imagefill($destImage, 0, 0, $white); // 居中复制 imagecopyresampled($destImage, $srcImage, ($cropSize - $newWidth) / 2, ($cropSize - $newHeight) / 2, 0, 0, $newWidth, $newHeight, $width, $height); } else { $srcImage = imagecreatefromjpeg($srcFile); $destImage = imagecreatetruecolor($cropSize, $cropSize); imagecopyresampled($destImage, $srcImage, 0, 0, $srcX, $srcY, $cropSize, $cropSize, $cropSize, $cropSize); }
imagejpeg($destImage, $destFile, 90); imagedestroy($srcImage); imagedestroy($destImage);}
// 示例:从中心裁剪200x200正方形cropCenter('photo.jpg', 'photo_cropped.jpg', 200);?>2. Imagick库(高级工具)
Imagick是强大工具ImageMagick的PHP封装。它预