ES6 实现递归压缩图片

相信很多人前端在上传图片时,为了优化性能,都会做一个图片压缩的功能,这里提供一段压缩代码,采用ES6标准书写。希望大家采纳指点。

html代码:

<html>
   <body>   
        <div class="form-upload"> 
      <input type="file" name="logo" hidden="hidden" accept="image/*" />
     </div>
  </body>
</html>

js代码:

/**
 * @file CompressImg
 * @author (zhangx@nsw88.com)
 * @param file 需要压缩的图片流
 * @param ratio 单次压缩率
 * @param maxSize 压缩最大极限
 */
class Compress {
    constructor(file, ratio = 0.6, maxSize = 100*1024){
        this.time = 0;  //压缩次数
        this.file = file;
        this.ratio = ratio;
        this.maxSize = maxSize;
        this.reader = new FileReader();
    }
    async init(){
        let {file} = this;
        if( this.file.size > this.maxSize){
            this.time++;
            this.file = await this.compressing(file);
        }
        //此处实现递归压缩,但是图片多次压缩后破损,暂时实现压缩一次,后期再改动
        if( this.file.size > this.maxSize && this.time < 1){
            this.file = await this.init()
        } else {
            return this.file;
        }
    }
    async compressing(file){ //图片压缩方法
        let bold = await new Promise((resolve, reject)=>{
            this.reader.onload = e =>{
                var src = e.target.result;
                resolve(this.canvasData(src))
            }
            this.reader.onerror = err => {  
                reject(err)   
            }; 
            this.reader.readAsDataURL(file);
        });
        return bold;
    }
    async canvasData(src){  //绘制canvas图片,输出压缩图片流
        let path = src, bold = null;
        bold = await new Promise((resolve, reject) => {
            var img = new Image();
            img.src = path;
            img.onload = e => {
                let {width,height} = e.target;
                let canvas = document.createElement('canvas');
                let ctx = canvas.getContext('2d');
                canvas.width = width;
                canvas.height = height;
                ctx.drawImage(e.target, 0, 0, width,height);
                canvas.toBlob(blob => {
                    resolve(blob)
                }, "image/jpeg", this.ratio);
            }
        })
        return bold;
    }
}
export default Compress;

//压缩调
var file = document.querySelector('.form-upload input').files[0];
用let cfile= await new Compress(file).init(); 

转载于:https://www.cnblogs.com/zerox-cn/p/8515755.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: webpack 的底层代码是由 Node.js 编写的,它是一个模块打包工具,可以将多个模块打包成一个文件,以便于在浏览器中使用。webpack 的主要功能是将 JavaScript、CSS、图片等资源打包成静态文件,并且可以进行代码压缩、模块化管理等操作,从而提高网站的性能和加载速度。webpack 的理解是一个非常重要的前端开发工具,可以帮助我们更好地管理和组织前端代码。 ### 回答2: webpack的底层代码是由JavaScript编写的,并且基于Node.js平台。它利用各种插件和加载器,通过模块化的方式来处理前端资源。webpack的基本原理是将前端项目中的各种资源,例如JavaScript文件、CSS文件、图片等,视为模块。通过配置文件指定入口文件,webpack会根据依赖关系,递归地分析模块之间的引用关系,并将它们打包成静态资源。 与传统的脚本引入方式相比,webpack具有以下优点: 1. 模块化:通过使用ES6的模块语法或CommonJS规范,可以将代码封装成独立的模块,提高代码的可维护性和复用性。 2. 代码分割:webpack能够将代码拆分成多个小模块,实现按需加载,提高页面的加载速度,减少网络请求。 3. 自动化:webpack提供了丰富的插件和加载器,可以自动进行代码转换、压缩、合并等操作,简化了开发流程。 4. 开发调试:webpack支持开发阶段的热模块替换(HMR),在修改代码后,能够自动刷新页面,提高开发效率。 在webpack的配置文件中,可以定义入口文件、输出路径、加载器、插件等。通过加载器可以对不同类型的资源进行处理,例如使用Babel加载器可以将ES6、ES7的代码转换成ES5的代码,使用CSS加载器可以处理CSS文件中的模块引用等。通过插件,可以实现更多的功能,例如压缩代码、提取CSS文件等。 总的来说,webpack是一个强大的模块打包工具,通过模块化和代码分割的方式,能够提高前端项目的开发效率和加载速度,使前端开发更加高效和便捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值