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菜鸟一枚请多指教 (*^▽^*)
以上是 Vue前端压缩图片 的全部内容, 来源链接: utcz.com/z/377295.html