zoukankan      html  css  js  c++  java
  • 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 },
  • 相关阅读:
    数据库为什么要分区分表
    搜索时 搜索条件在被搜索范围内
    Spring RestTemplet https请求
    微信三方平台接入
    在安装RedisDesktopManager的时候遇到 .dll文件缺失解决办法
    Spring中常见的设计模式——装饰者模式
    Spring中常见的设计模式——适配器模式
    Spring中常见的设计模式——模板模式
    Spring中常见的设计模式——策略模式
    Spring中常见的设计模式——代理模式
  • 原文地址:https://www.cnblogs.com/lvshaonan/p/8547676.html
Copyright © 2011-2022 走看看