转载:https://blog.csdn.net/sunddy_x/article/details/123528350
前言
之前图片压缩是公司前辈留下的一个js方法,采用的回调函数处理。最近一个项目为了优化用户体验,在图片上传失败后要根据接口返回的状态值更改页面UI,此时该js方法就会出现异常,于是我找到了 image-conversion
。
安装
npm i image-conversion --save
或者
yarn add image-conversion
引入
import * as imageConversion from 'image-conversion'
或者
import {compress, compressAccurately} from 'image-conversion'
常用方法列表
compress
语法
compress(file, config) → {Promise(Blob)}
参数
名称 | 类型 | 描述 |
---|---|---|
file | File(Blob) | 一个File(Blob)对象 |
config | number or object | 如果是数字类型,范围0-1,表示图像质量; 如果是对象类型,你可以传递参数给imagetoCanvas和dataURLtoFile方法; |
举例
// number imageConversion.compress(file,0.8) // object imageConversion.compress(file,{ quality: 0.8, type: "image/jpeg", width: 300, height: 200, orientation:2, scale: 0.5, })
返回值
返回一个包含Blob对象的Promise
compressAccurately
该方法可以精确修改图片的大小
语法
compressAccurately(file, config) → {Promise(Blob)}
参数
名称 | 类型 | 描述 |
---|---|---|
file | File(Blob) | 一个File(Blob)对象 |
config | number or object | 如果是number类型,指定压缩图像的大小(单位KB); 如果是对象类型,你可以传递参数给imagetoCanvas和dataURLtoFile方法; |
举例
// number imageConversion.compressAccurately(file,100); // 压缩后的图像大小为100kb // object imageConversion.compressAccurately(file,{ // 压缩后的图像大小为100kb size: 100, // 图像压缩尺寸的精度,范围0.8-0.99,默认为0.95; // 这意味着如果图片大小设置为1000Kb,精度为0.9,则认为压缩结果为900Kb-1100Kb的图像是可接受的; accuracy: 0.9, type: "image/jpeg", width: 300, height: 200, orientation:2, scale: 0.5, })
返回值
返回一个包含Blob对象的Promise
此处只记录以上两个方法,有更多需求可跳转官方文档
实例
该项目为 Vue + Vant
,此处使用Uploader文件上传执行图片压缩并上传的操作
// template <van-field name="本人照片" label="本人照片" required> <template #input> <van-uploader v-model="uploader" :max-count="1" :after-read="afterRead" /> </template> </van-field> // script import * as imageConversion from 'image-conversion' // methods async afterRead(file) { // 此时可以自行将文件上传至服务器 console.log(file) file.status = 'uploading' file.message = '上传中...' // 将图片精确压缩到600kb const blob = await imageConversion.compressAccurately(file.file, 600) // Blob转FormData const formdata = new FormData() // append第三个参数为可选项,此处本项目接口需要 formdata.append('file', blob, file.file.name) // 调用fileUpload接口 const { code, data } = await fileUpload(formdata) // 此处code为接口定义状态码,本项目成功为0 if (code === 0) { file.status = 'done' file.message = '上传成功' console.log(data) } else { file.status = 'failed' file.message = '上传失败' } }