JavaScript前端图片压缩

匿名 (未验证) 提交于 2019-12-02 21:53:52

实现思路

  • 获取input的file
  • 使用fileReader() 将图片转为base64
  • 使用canvas读取base64 并降低分辨率
  • 把canvas数据转成blob对象
  • 把blob对象转file对象
  • 完成压缩

相关代码:

<!doctype html> <html lang="en"> <head>     <meta charset="UTF-8">     <meta name="viewport"           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">     <meta http-equiv="X-UA-Compatible" content="ie=edge">     <title>Document</title> </head> <body> <input type="file" id="file"> <script>     document.getElementById('file').addEventListener('change',function (e) {         let fileObj = e.target.files[0]         let that = this;         compressFile(fileObj,function (files) {             console.log(files)              that.value = '' // 加不加都行,解决无法上传重复图片的问题。          })      })      /**      * 压缩图片      * @param file input获取到的文件      * @param callback 回调函数,压缩完要做的事,例如ajax请求等。      */     function compressFile(file,callback) {         let fileObj = file;         let reader = new FileReader()         reader.readAsDataURL(fileObj) //转base64         reader.onload = function(e) {              let image = new Image() //新建一个img标签(还没嵌入DOM节点)             image.src = e.target.result             image.onload = function () {                 let canvas = document.createElement('canvas'), // 新建canvas                     context = canvas.getContext('2d'),                     imageWidth = image.width / 2,    //压缩后图片的大小                     imageHeight = image.height / 2,                     data = ''                 canvas.width = imageWidth                 canvas.height = imageHeight                 context.drawImage(image, 0, 0, imageWidth, imageHeight)                 data = canvas.toDataURL('image/jpeg') // 输出压缩后的base64                 let arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1], // 转成blob                     bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);                 while (n--) {                     u8arr[n] = bstr.charCodeAt(n);                 }                 let files = new window.File([new Blob([u8arr], {type: mime})], 'test.jpeg', {type: 'image/jpeg'}) // 转成file                 callback(files) // 回调             }         }     } </script> </body> </html>

最后回调函数中的files可以直接当做正常的input file 使用,如果后续涉及到ajax,可以直接放到formData() 里。

本例除文中源码外,不另外提供源码。

参考地址1:https://blog.csdn.net/yasha97/article/details/83629057
参考地址2:https://blog.csdn.net/yasha97/article/details/83629510

在原文章基础上添加了blob => file的对象转化。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!