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。

相关文章
|
2月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
375 5
|
7月前
|
资源调度 JavaScript 前端开发
vue2_二次封装a-upload组件,自定义上传预览
vue2_二次封装a-upload组件,自定义上传预览
458 0
|
4月前
|
JavaScript 前端开发 编译器
纯前端如何实现批量dom转图片,并下载成压缩包
【8月更文挑战第22天】纯前端如何实现批量dom转图片,并下载成压缩包
106 0
|
5月前
|
Java
软件开发常用之SpringBoot文件下载接口编写(下),Vue+SpringBoot文件上传下载预览,服务器默认上传是1M,可以调节,调节文件上传大小写法,图片预览,如何预览后下次还能看到,预览写法
软件开发常用之SpringBoot文件下载接口编写(下),Vue+SpringBoot文件上传下载预览,服务器默认上传是1M,可以调节,调节文件上传大小写法,图片预览,如何预览后下次还能看到,预览写法
|
7月前
|
JSON Rust 前端开发
【sheetjs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了如何使用`sheetjs`的`xlsx`库在前端实现Excel的导出和上传。项目依赖包括Vite、React、SheetJS和Arco-Design。对于导出,从后端获取JSON数据,通过`json_to_sheet`、`book_new`和`writeFile`函数生成并下载Excel文件。对于上传,使用`read`函数将上传的Excel文件解析为JSON并发送至后端。完整代码示例可在GitHub仓库[fullee/sheetjs-demo](https://github.com/fullee/sheetjs-demo)中查看。
445 10
|
7月前
|
前端开发
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
802 0
|
JSON 前端开发 API
layui框架实战案例(8):web图片裁切插件croppers.js组件实现上传图片的自定义截取(含php后端)
layui框架实战案例(8):web图片裁切插件croppers.js组件实现上传图片的自定义截取(含php后端)
575 0
|
编解码 前端开发 JavaScript
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
275 0
|
前端开发
前端学习案例1-blob对象实现文件的下载和图片预览1
前端学习案例1-blob对象实现文件的下载和图片预览1
143 0
前端学习案例1-blob对象实现文件的下载和图片预览1
|
前端开发
前端学习案例2-blob对象实现文件的下载和图片预览2
前端学习案例2-blob对象实现文件的下载和图片预览2
113 0
前端学习案例2-blob对象实现文件的下载和图片预览2