vue移动端图片上传压缩
上传压缩方法
1 import {api} from '../../api/api.js'; 2 import axios from 'axios'; 3 export function imgPreview (that, file, type) { 4 let self = that; 5 let Orientation; 6 if (!file || !window.FileReader) return; 7 if (/^image/.test(file.type)) { 8 // 创建一个reader 9 let reader = new FileReader(); 10 // 将图片2将转成 base64 格式 11 reader.readAsDataURL(file); 12 // 读取成功后的回调 13 reader.onloadend = function () { 14 let result = this.result; 15 let img = new Image(); 16 img.src = result; 17 //判断图片是否大于100K,是就直接上传,反之压缩图片 18 if (this.result.length <= (100 * 1024)) { 19 if(type == 'imageFront'){ 20 upImgFront(self, this.result); 21 } 22 }else { 23 img.onload = function () { 24 let src = compress(img,Orientation); 25 if(type == 'imageFront'){ 26 upImgFront(self, src); 27 } 28 } 29 } 30 } 31 } 32 } 33 function compress(img,Orientation) { 34 let canvas = document.createElement("canvas"); 35 let ctx = canvas.getContext('2d'); 36 //瓦片canvas 37 let tCanvas = document.createElement("canvas"); 38 let tctx = tCanvas.getContext("2d"); 39 let initSize = img.src.length; 40 let width = img.width; 41 let height = img.height; 42 //如果图片大于四百万像素,计算压缩比并将大小压至400万以下 43 let ratio; 44 if ((ratio = width * height / 4000000) > 1) { 45 console.log("大于400万像素") 46 ratio = Math.sqrt(ratio); 47 width /= ratio; 48 height /= ratio; 49 } else { 50 ratio = 1; 51 } 52 canvas.width = width; 53 canvas.height = height; 54 // 铺底色 55 ctx.fillStyle = "#fff"; 56 ctx.fillRect(0, 0, canvas.width, canvas.height); 57 //如果图片像素大于100万则使用瓦片绘制 58 let count; 59 if ((count = width * height / 1000000) > 1) { 60 console.log("超过100W像素"); 61 count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片 62 // 计算每块瓦片的宽和高 63 let nw = ~~(width / count); 64 let nh = ~~(height / count); 65 tCanvas.width = nw; 66 tCanvas.height = nh; 67 for (let i = 0; i < count; i++) { 68 for (let j = 0; j < count; j++) { 69 tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh); 70 ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh); 71 } 72 } 73 } else { 74 ctx.drawImage(img, 0, 0, width, height); 75 } 76 //进行最小压缩 77 let ndata = canvas.toDataURL('image/jpeg', 0.3); 78 tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0; 79 return ndata; 80 } 81 // 身份证正面 82 function upImgFront(that, src) { 83 that.isLoadingShow = true; 84 that.loadingTit = '图片上传中...'; 85 axios({ 86 method: 'post', 87 url: api + '/upload/image/base64', 88 data: { 89 fileBase64: src, 90 authType: '1' 91 }, 92 transformRequest: [function (data) { 93 let ret = '' 94 for (let it in data) { 95 ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&' 96 } 97 return ret 98 }], 99 headers: { 100 'Content-Type': 'application/x-www-form-urlencoded' 101 } 102 }) 103 .then((res) => { 104 that.isLoadingShow = false; 105 if(res.data.code == 0){ 106 that.imageFrontPath = res.data.data.path; 107 if(res.data.data.info){ 108 if(res.data.data.info.address){ 109 that.idCardFrontDialogAddress = res.data.data.info.address; 110 } 111 if(res.data.data.info.name){ 112 that.idCardFrontDialogName = res.data.data.info.name; 113 } 114 if(res.data.data.info.number){ 115 that.idCardFrontDialogId = res.data.data.info.number; 116 } 117 } 118 that.idCardFrontDialog = true; 119 that.isFrontSuccess = true; 120 that.imageFront = src; 121 }else{ 122 setTimeout(() => { 123 that.isDialogShow = true; 124 },100); 125 that.dialogTit = '图片上传失败'; 126 } 127 }) 128 .catch((error) => { 129 // that.isLoadingShow = false; 130 // setTimeout(() => { 131 // that.isDialogShow = true; 132 // },100); 133 // that.dialogTit = '服务器错误'; 134 // console.log('错误了'+ error); 135 }); 136 }
html
1 <li class="input-img"> 2 <span class="item"><b>∗</b>身份证正面照</span> 3 <span class="item-value"> 4 <a href="javascript:" class="input-img-btn" v-on:click="addPicFront">+</a> 5 <input type="file" @change="onFileFrontChange" style="display: none;" ref="onFileFrontChange" accept="image/*"> 6 <span class="img-wrapper" v-if="imageFront"> 7 <img :src="imageFront" alt="" > 8 <b class="delete" @click="onDelete('imageFront')"></b> 9 </span> 10 <span class="img-wrapper" v-else> 11 <img src="./u111.png" alt="" > 12 <i>示例照片</i> 13 </span> 14 </span> 15 </li>
javascript
1 addPicFront(e){ 2 e.preventDefault(); 3 this.$refs.onFileFrontChange.click(); 4 return false; 5 }, 6 7 onFileFrontChange(e) { 8 var files = e.target.files || e.dataTransfer.files; 9 if (!files.length) return; 10 imgPreview(this, files[0], 'imageFront'); 11 this.$refs.onFileFrontChange.value = ''; 12 this.idCardFrontDialogName = ''; 13 this.idCardFrontDialogId = ''; 14 this.idCardFrontDialogAddress = ''; 15 },