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>&lowast;</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 },

 

posted @ 2018-03-12 09:49  一像素boy  阅读(9373)  评论(0编辑  收藏  举报