前段时间有个需求涉及小程序还原H5当中的图片上传功能。 没有细节考虑好就跟后端的老哥说接口不用改直接前端处理。。。 如今想一想真是心疼我本身
直接上传流文件到服务器,而后在服务器作base64转换处理。
既然是使用canvas方法,那么首先须要在wxml里添加一个canvas元素前端
<canvas canvas-id="mycanvas"></canvas>
若是不加,页面canvasGetImageData方法没法生成,display:none也不行canvas
js部分省略获取imgPath过程小程序
var canvasid='mycanvas' var ctx = wx.createCanvasContext(canvasid) //操做对应id的canvas ctx.drawImage(imgPath,0,0,width,height)//绘画图片,把图片放进去。这里的宽高能够使用wx.getImageInfo获取用户上传图片原本的宽高 ctx.draw(function(){ wx.canvasGetImageData({ canvasId:canvasid //参数,canvas标签的id x:0,//起始位置,x坐标 y:0, width:width, height:height, success:function(res){ //引入upng,将图片转化成utf-8格式 let pngData = upng.encoded([res.data.buffer].res.width,res.height)//再转化成base64 let bs64 = wx.arrayBufferToBase64(pngData) } }) });
wx.request({ url:imgPath, responseType: 'arraybuffer',//最关键的参数,设置返回的数据格式为arraybuffer success:res=>{ let base64 = wx.arrayBufferToBase64(res);//把arraybuffer转成base64 base64 = 'data:image/jpeg;base64,' + base64 //不加上这串字符,在页面没法显示的哦 console.log(base64) //打印出base64字符串,可复制到网页校验一下是不是你选择的原图片呢 } });
使用upng方法确实能解决问题,可是引入upng组件相对有些庞大(只相对于处理base64这个功能),现阶段更加合适的处理方式仍是上传到后端来处理图片格式。后端