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 = {
  width: 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菜鳥一枚請多指教  (*^▽^*)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM