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'])

 

posted @ 2021-03-15 15:54  但丿行好事  阅读(966)  评论(0编辑  收藏  举报