element-ui 图片压缩上传

picture.js

js 复制代码
export const compressImgNew = (file) => {
  return new Promise(resolve => {
    const reader = new FileReader()
    const image = new Image()
    image.onload = (imageEvent) => {
      const canvas = document.createElement('canvas') // 创建画布
      const context = canvas.getContext('2d')         // 画布为2d
      // const width = image.width / 1.05        // 图片宽度 / 压缩比例
      // const height = image.height / 1.05        // 图片高度 / 压缩比例
      const width = image.width / 3       // 图片宽度 / 压缩比例
      const height = image.height / 3       // 图片高度 / 压缩比例
      canvas.width = width                            // 画布宽度
      canvas.height = height                          // 画布宽度
      context.clearRect(0, 0, width, height)
      context.drawImage(image, 0, 0, width, height)
      const dataUrl = canvas.toDataURL(file.type)     //图片转路径
      const blobData = dataURLtoBlob(dataUrl, file.type) //图片转二进制
      resolve(blobData)
    }
    reader.onload = e => { image.src = e.target.result }
    reader.readAsDataURL(file)
  })
};

//图片转二进制
function dataURLtoBlob(dataURL, type) {
  var binary = atob(dataURL.split(',')[1])
  var array = []
  for (var i = 0; i < binary.length; i++) {
    array.push(binary.charCodeAt(i))
  }
  return new Blob([new Uint8Array(array)], { type: type })
}

使用

import { compressImgNew } from "@/assets/js/picture.js";

js 复制代码
    beforeAvatarUpload(file) {
      let types = [
        "image/jpeg",
        "image/jpg",
        "image/png"
      ];
      const isImage = types.includes(file.type);
      const isLtSize = file.size / 1024 / 1024 < 5;
      if (!isImage) {
        this.$message.warning("上传图片只能是 JPG、JPEG、PNG 格式!");
        return false;
      }
      if (!isLtSize) {
        this.$message.warning("上传图片大小不能超过 5MB!");
        return false;
      }
      return compressImgNew(file);
    },
相关推荐
Jimmy14 分钟前
TypeScript 泛型:2025 年终极指南
前端·javascript·typescript
来来走走19 分钟前
Flutter dart运算符
android·前端·flutter
Spider_Man23 分钟前
栈中藏玄机:从温度到雨水,单调栈的逆袭之路
javascript·算法·leetcode
moddy24 分钟前
新人怎么去做低代码,并且去使用?
前端
风清云淡_A25 分钟前
【Flutter3.8x】flutter从入门到实战基础教程(五):Material Icons图标的使用
前端·flutter
安心不心安30 分钟前
React ahooks——副作用类hooks之useThrottleEffect
前端·react.js·前端框架
jstart千语31 分钟前
【vue】创建响应式数据ref和reactive的区别
前端·javascript·vue.js
肖师叔爱抽风38 分钟前
使用nvm use切换版本时出现虚假成功信息,使用nvm ls,实际显示没有切换成功,解决方法
前端
猩猩程序员40 分钟前
Rust为什么需要Borrow Trait
前端
BUG收容所所长41 分钟前
Zustand状态管理如何驱动低代码平台的数据流?
前端·javascript·设计