转载: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 = '上传失败'
  }
}

 

posted on 2022-05-26 10:29  刘世涛6192  阅读(1252)  评论(0编辑  收藏  举报