• Vue前端压缩图片


    一、在组件包下新建compressImage.js

     1 // 压缩图片
     2 // eslint-disable-next-line no-unused-vars
     3 export function compressImage (file, config) {
     4   // eslint-disable-next-line no-unused-vars
     5   let src
     6   // eslint-disable-next-line no-unused-vars
     7   let files
     8   // let fileSize = parseFloat(parseInt(file['size']) / 1024 / 1024).toFixed(2)
     9   const read = new FileReader()
    10   read.readAsDataURL(file)
    11   return new Promise(function (resolve, reject) {
    12     read.onload = function (e) {
    13       let img = new Image()
    14       img.src = e.target.result
    15       img.onload = function () {
    16         // 默认按比例压缩
    17         let w = config.width
    18         let h = config.height
    19         // 生成canvas
    20         let canvas = document.createElement('canvas')
    21         let ctx = canvas.getContext('2d')
    22         let base64
    23         // 创建属性节点
    24         canvas.setAttribute('width', w)
    25         canvas.setAttribute('height', h)
    26         ctx.drawImage(this, 0, 0, w, h)
    27        
    28         base64 = canvas.toDataURL(file['type'], config.quality)
    29      
    30         // 回调函数返回file的值(将base64编码转成file)
    31         // files = dataURLtoFile(base64) // 如果后台接收类型为base64的话这一步可以省略
    32 
    33         // 回调函数返回file的值(将base64转为二进制)
    34         let fileBinary = dataURLtoBlob(base64)
    35 
    36         resolve(fileBinary)
    37       }
    38     }
    39   })
    40 };
    41 
      // 将base64转为二进制 42 function dataURLtoBlob (dataurl) { 43 let arr = dataurl.split(',') 44 let mime = arr[0].match(/:(.*?);/)[1] 45 let bstr = atob(arr[1]) 46 let n = bstr.length 47 let u8arr = new Uint8Array(n) 48 while (n--) { 49 u8arr[n] = bstr.charCodeAt(n) 50 } 51 return new Blob([u8arr], { type: mime }) 52 } 53 54 // base64转码(将base64编码转回file文件) 此方法我没用到 55 // eslint-disable-next-line no-unused-vars 56 function dataURLtoFile (dataurl) { 57 let arr = dataurl.split(',') 58 let mime = arr[0].match(/:(.*?);/)[1] 59 let bstr = atob(arr[1]) 60 let n = bstr.length 61 let u8arr = new Uint8Array(n) 62 while (n--) { 63 u8arr[n] = bstr.charCodeAt(n) 64 } 65 return new File([u8arr], { type: mime }) 66 }

    二、在所需页面引入compressImage.js

    import { compressImage } from '@/components/compressImage'// 图片压缩方法

    三、使用方法

    let config = {
       100, // 压缩后图片的宽
      height: 100, // 压缩后图片的高
      quality: 1 // 压缩后图片的清晰度,取值0-1,值越小,所绘制出的图像越模糊
    }
    
    compressImage(file, config)
      .then(result => { // result 为压缩后二进制文件
        this.methodA(result)
      })

    四、拿到压缩后的二进制文件该怎样发送给后台呢?(我后台用的是  MultipartFile file)

    methodA(result) {
      let fileData = new FormData()
      fileData.append('file', result)
      methodB(fileData)     .then(res => {            }) }

    五、判断文件大小,文件太小则不压缩(如果有需要)

    // 单位 M(兆)
    let fileSize = parseFloat(parseInt(file['size']) / 1024 / 1024).toFixed(2)

    ok,结束!vue菜鸟一枚请多指教  (*^▽^*)

  • 相关阅读:
    [BZOJ2661][BeiJing wc2012]连连看 费用流
    <meta> 标签
    CSS3 Transitions, Transforms和Animation的使用
    word-wrap和word-break的区别吗?
    css3中比较少用到的属性记录
    CSS ::Selection的使用方法
    CSS 属性
    javascript正则表达式语法
    jquery metadata 详解
    关于window.console&&console.log(123)的思考
  • 原文地址:https://www.cnblogs.com/jeffreyu/p/13203123.html
Copyright © 2020-2023  润新知