上传图片前压缩图片

  • Post author:
  • Post category:其他




项目场景:

在上传图片前,对图片进行压缩处理



解决方案:



1.自己写压缩方法(不推荐)

(1)创建公共类封装压缩方法

compressImg.js:

/* 图片压缩方法-canvas压缩 */
function compressUpload(image, file) {
    let compressData
    let canvas = document.createElement('canvas')
    let ctx = canvas.getContext('2d')
    let { width } = image, { height } = image
    let fileSize = parseFloat(parseInt(file.size)/1024).toFixed(2);
    canvas. width = width
    canvas.height = height
    ctx.fillRect(0, 0, canvas.width, canvas.height)
    ctx.drawImage(image, 0, 0, width, height)
    if(fileSize<=500){
        compressData = canvas.toDataURL(file.type || 'image/jpeg')   //500kb以内默认
    }else if (fileSize>500&&fileSize<=1024){
        compressData = canvas.toDataURL(file.type || 'image/jpeg', 0.8) //500kb-1mb以内压缩0.8
    }else{
        compressData = canvas.toDataURL(file.type || 'image/jpeg', 0.6) //大于1mb的都压缩0.6
    }
    // 因为压缩完成后的图片为base64编码,所以要调用方法进行base64转file文件
    let fileImg = dataURItoFile(compressData,file)
    return fileImg
}

/* base64转File文件 (这里根据需求来转换类型)*/
function dataURItoFile(data,file) {
    let arr = data.split(',')
    let bstr = atob(arr[1])
    let n = bstr.length
    let u8arr = new Uint8Array(n)
    let mime = arr[0].match(/:(.*?);/)[1]
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new File([u8arr], file.name, { type: mime });
}

export function beforeUpload(file) {
    return new Promise((resolve, reject) => {
        let image = new Image(),
        let resultFile = '';
        image.src = URL.createObjectURL(file);
        image.onload = () => {
            // 调用方法获取File文件格式
            resultFile = compressUpload(image, file);
            resolve(resultFile)
        }
        image.onerror = () => {
            reject()
        }
    })
}

(2)引用压缩方法:

import { beforeUpload } from "@/public/compressImg";

使用压缩方法,因为该方法为异步执行,所以要用async await 解决异步问题:

在这里插入图片描述

特别注意:这个方法对.png格式的图片无效!!!所以推荐使用下面的方法。



2.引入imageConversion安装包,进行压缩

(1)安装image-conversion包:

npm i image-conversion --save

(2)引用:

import * as imageConversion from 'image-conversion';

(3)实现压缩:

function beforeUpload(file){    //此压缩得到Blob对象
    return new Promise((resolve, reject) => {
        let fileSize = parseFloat(parseInt(file.size)/1024).toFixed(2);
        if(fileSize<=500){
            resolve(file);
        }else if(fileSize>500&&fileSize<=1024){
            //自定义压缩250kb,实际有误差,控制在300kb内
            imageConversion.compressAccurately(file, 250).then((res) => {
                resolve(res);
            });
        }else{
            //自定义压缩450kb,实际有误差,控制在500kb内
            imageConversion.compressAccurately(file, 450).then((res) => {
                resolve(res);
            });
        }          
    })
}

(4)使用压缩方法,因为该方法为异步执行,所以要用async await 解决异步问题:

在这里插入图片描述

参考:

1.

Vue + Element-ui upload 上传前压缩图片


2.

vue中实现图片压缩 file文件的方法


3.

canvas学习——toDataURL()方法


4.

vue+element-ui upload前端js压缩图片上传



版权声明:本文为weixin_44886300原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。