JavaScript压缩图片,base64图片压缩
知道了图片压缩可能出现的问题,接下来就是压缩步骤了
1、场景
用input的形式选中图片往服务器上上传,如果图片太大,可能出现请求错误(包体过大的报错)
给input绑定onChange事件
1 <input 2 class="upload-after" 3 accept="image/*" 4 name="upload_after_input" 5 id="upload_after_input" 6 type="file" 7 onchange="preview(this, 'j-after', 'delIconAfter', 'zoomIconAfter', 'back')" 8 />
2、使用函数处理图片
1 function preview(that, imgId, delImgId, zoomImgId, inputId) { 2 if (that.files.length === 0) { 3 return 4 } 5 const read = new FileReader() 6 read.readAsDataURL(that.files[0]) 7 read.onload = function (s) { 8 //这里还可以做其他处理 11 imgHandle(imgId, s.target.result, inputId) 12 } 13 }
3、接下来就是图片进行转换
图片处理的思路
1、先创建一个image对象
2、获取原图的宽高(目的是为了压缩之后的图片和原图片等比)
3、使用canvas将原图另外绘制一次,在绘制的时候设置图片质量、宽、高(一共三个参数,可以控制生成的图片的大小,质量越高,生成之后的图片越大)
4、用canvas生成的base64图片,生成新的file文件,就是我们最终的文件了,把他放在自定义的变量里面,submit的时候,直接取变量里面的值
1 function imgHandle(imgId, imgSrc, inputId) { 2 imgIndex = inputId 3 let img = new Image() 4 img.src = imgSrc 5 img.onload = function (params) { 6 var that = this 7 // 默认按比例压缩 8 var w = that.width, 9 h = that.height, 10 scale = w / h 11 var quality = 0.70 // 默认图片质量为0.7 12 //生成canvas 13 var canvas = document.createElement('canvas') 14 var ctx = canvas.getContext('2d') 15 // 创建属性节点 16 var anw = document.createAttribute('width') 17 anw.nodeValue = w 18 var anh = document.createAttribute('height') 19 anh.nodeValue = h 20 canvas.setAttributeNode(anw) 21 canvas.setAttributeNode(anh) 22 ctx.drawImage(that, 0, 0, w, h) 23 24 let base64 = canvas.toDataURL('image/jpeg', quality) 25 imgObj[imgIndex] = dataURLtoFile(base64, imgIndex) // 将图片存到变量
28 } 29 }
4、base64图片生成file文件
1 function dataURLtoFile(dataurl, filename) { 2 //将base64转换为文件 3 var arr = dataurl.split(','), 4 mime = arr[0].match(/:(.*?);/)[1], 5 bstr = atob(arr[1]), 6 n = bstr.length, 7 u8arr = new Uint8Array(n) 8 while (n--) { 9 u8arr[n] = bstr.charCodeAt(n) 10 } 11 return new File([u8arr], filename, { type: mime }) 12 }
5、使用的时候,直接从变量里面取值就好
1 fd.append('face', imgObj['face']) 2 fd.append('back', imgObj['back'])