博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue开发中vue-resource + canvas 图片压缩、上传、预览
阅读量:5113 次
发布时间:2019-06-13

本文共 4371 字,大约阅读时间需要 14 分钟。

1、使用vue-resource上传,也可以自定义ajax上传;

2、使用<input type="file" @change="submit()" name="multipart" class="element" accept="image/*" id="headerImage">标签,在submit的时候执行方法

3、正式代码  let oFiles = document.querySelector("#headerImage").files; 

4、压缩图片:

1 modify_img_size (path, obj, callback) { 2  3 //path可以是相对路径,也可以是base64位,我这里传的是bse64位 4         var img = new Image(); 5         img.src = path; 6  7         img.onload = function () { 8 //图片加载初始化执行 9 10           var that = this;11           var w = that.width,12 13             h = that.height,14             scale = w / h;15           w = obj.width || w;16           h = obj.height || (w / scale);17 //图片的质量为0.5,越小越模糊,文件也就越小18           var quality = 0.5;   19 20           //创建canvas画图21           var canvas = document.createElement('canvas');22           var ctx = canvas.getContext('2d');23 24           var anw = document.createAttribute("width");25           anw.nodeValue = w;26           var anh = document.createAttribute("height");27           anh.nodeValue = h;28           canvas.setAttributeNode(anw);29           canvas.setAttributeNode(anh);30 31           ctx.drawImage(that, 0, 0, w, h);32 33           if (obj.quality && obj.quality <= 1 && obj.quality > 0) {34             quality = obj.quality;35           }36        37           var base64 = canvas.toDataURL('image/jpeg', quality);38 39           callback(base64);40         }41 42       }

 

5、读取二进制(base64位信息),let zipReady = new FileReader();      zipReady.readAsDataURL(oFiles[0]);   初始化读取base64,上传、预览:

1  let _that = this;     2  3         zipReady.onload = function (e) {     //初始化开始 4  5 //调用压缩方法,e.target.result为压缩结果 , {width: 1000}为压缩后宽度,resImg为压缩之后的base64位回调函数结果 6  7           _that.modify_img_size(e.target.result, {width: 1000}, function (resImg) { 8  9 10 //转为8 位无符号整数值的类型化数组,存为图片信息,有返回值11             function dataURItoBlob(dataURI) {  12 13            14               var byteString;15               if (dataURI.split(',')[0].indexOf('base64') >= 0)16                 byteString = atob(dataURI.split(',')[1]);17               else18                 byteString = unescape(dataURI.split(',')[1]);19               // separate out the mime component20               var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];21               // write the bytes of the string to a typed array22               var ia = new Uint8Array(byteString.length);23               for (var i = 0; i < byteString.length; i++) {24                 ia[i] = byteString.charCodeAt(i);25               }26 27               console.info(ia);28               return new Blob([ia], {type:mimeString});29             }30 31 //**********************************************************32 33 34             var blob = dataURItoBlob(resImg);    //将base64做处理35 36 37             let formDataImg = new FormData();38 39             formDataImg.append('multipart', blob, oFiles[0].name);40 //将从内存中读取处理之后的数据流blob插入form表单中,记得要给它取个名字,否则后端不能识别,我这里去的是原始图片的名字41 42             formDataImg.append('accessToken', aToken);43 44 //如果查过2M则提示图片太大,返回45             if (resImg.length > 2097152) {46 47               Toast(_that.$t('message.myInfo.tobig'))48 49               return true50             }51 52 53 //        预览图片,用户选择一次不满意,要重先选择,则要删掉这个img标签,重先创建一个img54             let getTempImgNode = document.getElementById('tempImg');55             if (getTempImgNode) {56               getTempImgNode.remove();57 58             }59 60 61             HTTP.postImg('/gate/v1/userExpandInfo/updateHeadPortrait', formDataImg).then(res => {62           63               if (res.code == 0) {64         65 66 //上传成功之后,再次读取base64信息,创建img,生成预览67                 let rdader = new FileReader();68                 rdader.readAsDataURL(oFiles[0]);69 70                 rdader.onload = function (e) {71 72                   let getPicParent = document.getElementById('changePic');73                   let newNode = document.createElement('img');74                   newNode.setAttribute('id', 'tempImg');75                   newNode.setAttribute('src', e.target.result);76 77                   getPicParent.appendChild(newNode)78 79                 };80 81 82                 return true;83               } else {84                 Toast(_that.$t('message.code[' + res.code + ']'));85 86               }87 88             })89 90           })91 92         };

 

 

转载于:https://www.cnblogs.com/YKSlu/p/7184234.html

你可能感兴趣的文章
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
遍历Map对象
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>