yii2.0上传图片的时候如何实现自动压缩?

简介: yii2.0上传图片的时候如何实现自动压缩?

在 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。

相关文章
|
存储 弹性计算 固态存储
阿里云服务器ECS共享型和独享区别选择(看这一篇就够了)
阿里云服务器ECS共享型和计算型、通用型有什么区别?什么是共享型云服务器?什么是独享型云服务器?性能区别大吗?如何选择?
3459 0
阿里云服务器ECS共享型和独享区别选择(看这一篇就够了)
|
存储 算法 搜索推荐
时间复杂度:一步步理解算法效率
时间复杂度:一步步理解算法效率,更多文章可关注我的微信公众号:Python学习杂记
874 0
el-tree技巧之只能选中最后一层级的子节点以及查找树结构第一个无子节点的叶节点
el-tree技巧之只能选中最后一层级的子节点以及查找树结构第一个无子节点的叶节点
echarts 热力图(中国地图版)
echarts 热力图(中国地图版)
869 0
|
前端开发 JavaScript
使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件
本文介绍了在Vue项目中使用`xlsx`和`xlsx-style`(或`xlsx-style-vite`)库实现导出具有自定义样式的Excel文件的方法,并提供了详细的示例代码和操作效果截图。
2044 2
使用Vue+xlsx+xlsx-style实现导出自定义样式的Excel文件
|
JSON JavaScript IDE
JSON 数据格式化方法
JSON 数据格式化方法
502 3
|
消息中间件 存储 运维
从 Kafka 2.x 到 Kafka 3.x:升级之旅
从 Kafka 2.x 到 Kafka 3.x:升级之旅
2521 2
|
11月前
|
IDE Java API
Javadoc的讲解使用
本文介绍了Javadoc工具的使用方法和常用标签,通过示例代码展示了如何为Java代码添加文档注释并使用Javadoc命令生成HTML格式的API文档。
330 0
|
安全 网络安全
用IE浏览器访问网站提示证书错误
当你在Internet Explorer中遇到证书错误提示,通常是因网站SSL/TLS证书问题或浏览器安全设置需调整。解决方法包括: 检查时间设置 调整IE设置 安装证书 调整计算机时间
553 3