在 Yii2.0 中,可以使用 PHP 的 GD 库来压缩图片。以下是一个实现自动压缩的示例:
// 获取上传的图片
$image = UploadedFile::getInstance($model, 'image');
// 如果有上传的图片
if ($image !== null) {
// 获取图片信息
$imageInfo = getimagesize($image->tempName);
$imageWidth = $imageInfo[0];
$imageHeight = $imageInfo[1];
// 计算缩放比例
$scale = min(
Yii::$app->params['maxImageWidth'] / $imageWidth,
Yii::$app->params['maxImageHeight'] / $imageHeight
);
// 计算缩放后的宽度和高度
$newWidth = intval($imageWidth * $scale);
$newHeight = intval($imageHeight * $scale);
// 创建一个新的画布
$newImage = imagecreatetruecolor($newWidth, $newHeight);
// 根据图片类型创建一个原始图像
switch ($imageInfo[2]) {
case IMAGETYPE_GIF:
$sourceImage = imagecreatefromgif($image->tempName);
break;
case IMAGETYPE_JPEG:
$sourceImage = imagecreatefromjpeg($image->tempName);
break;
case IMAGETYPE_PNG:
$sourceImage = imagecreatefrompng($image->tempName);
break;
default:
throw new \Exception('Unsupported image type.');
}
// 缩放并复制原始图像到新的画布
imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
// 保存缩放后的图片
switch ($imageInfo[2]) {
case IMAGETYPE_GIF:
imagegif($newImage, $image->tempName);
break;
case IMAGETYPE_JPEG:
imagejpeg($newImage, $image->tempName);
break;
case IMAGETYPE_PNG:
imagepng($newImage, $image->tempName);
break;
default:
throw new \Exception('Unsupported image type.');
}
// 销毁画布
imagedestroy($newImage);
}
在这个示例中,我们首先获取上传的图片,然后使用 getimagesize() 函数获取图片的宽度和高度。接着,我们计算缩放比例,创建一个新的画布,并根据图片类型创建一个原始图像。然后,我们使用 imagecopyresampled() 函数将原始图像缩放并复制到新的画布中。最后,我们使用适当的函数将缩放后的图片保存到原始文件中,并销毁画布。
请注意,这只是一个简单的示例,如果需要更高级的图片处理功能,可能需要使用更专业的图像处理库,如 ImageMagick 或 GD Library。