Web前端开发网

fly63.com

首页 资源 工具 文章 教程 栏目
  • 在线搜索
  • 文章标签
  • 广告合作
  • 赞助一下
  • 关于我们
资源推荐
阿里云优惠券
卓越的云计算技术和服务提供商
腾讯云优惠券
云服务器,云数据库,CDN,域名注册等多种云计算服务
扣子Coze
职场AI,就用扣子
豆包AI
字节跳动旗下 AI 智能助手
即梦AI
一站式智能创作平台,即刻造梦
AiPPT
全智能AI一键生成 PPT
堆友AI
零门槛,多风格AI绘画免费生成,电商海报设计神器
蜂小推
不扣量的项目推广平台
SpeedAI
一键去重、降AIGC率、数据可视化、论文写作

资源分类

AI智能 酷站推荐 招聘/兼职 框架/库 模块/管理 移动端UI框架 Web-UI框架 Js插件 Jquery插件 CSS相关 IDE环境 在线工具 图形动效 游戏框架 node相关 调试/测试 在线学习 社区/论坛 博客/团队 前端素材 图标/图库 建站资源 设计/灵感 IT资讯
网站收录 / 问题反馈

compressor.js

分享
复制链接
新浪微博
QQ 好友

扫一扫分享

网站地址:https://fengyuanchen.github.io/compressorjs
GitHub:https://github.com/fengyuanchen/compressorjs
网站描述:纯前端图片压缩js库
访问官网
GitHub

纯前端图片压缩工具现在的网站几乎都离不开图片,无论是商品展示、用户头像还是内容配图。但图片体积大是个头疼的问题——既占服务器空间,又耗用户流量。compressor.js的出现正好解决了这个痛点,它能在前端直接压缩图片,再上传到服务器,大大减轻了存储和传输的压力。


为什么选择compressor.js?

简单直接:几行代码就能实现图片压缩
前端处理:不占用服务器资源,用户选择图片后立即压缩
质量可控:虽然是有损压缩,但压缩效果很理想
兼容性好:基于浏览器原生能力,主流浏览器都支持


快速上手

1. 引入compressor.js

有三种方式可以引入:

CDN方式(最简单):

<script src="https://cdn.jsdelivr.net/npm/compressorjs@1.2.1/dist/compressor.min.js"></script>

npm安装:

npm install compressorjs

然后在代码中引入:

import Compressor from 'compressorjs';

直接下载:
从GitHub下载文件,然后本地引入。

2. 基础使用示例

先来看一个最基础的压缩例子:

<!DOCTYPE html>
<html>
<head>
    <title>图片压缩示例</title>
</head>
<body>
    <input type="file" id="imageInput" accept="image/*">
    <script src="https://cdn.jsdelivr.net/npm/compressorjs@1.2.1/dist/compressor.min.js"></script>
    <script>
        document.getElementById('imageInput').addEventListener('change', function(e) {
            const file = e.target.files[0];
            if (!file) return;

            new Compressor(file, {
                quality: 0.6,
                success(result) {
                    // 压缩成功后,result就是压缩后的文件
                    console.log('原文件大小:', (file.size / 1024 / 1024).toFixed(2), 'MB');
                    console.log('压缩后大小:', (result.size / 1024 / 1024).toFixed(2), 'MB');
                    
                    // 创建下载链接或上传到服务器
                    const url = URL.createObjectURL(result);
                    const a = document.createElement('a');
                    a.href = url;
                    a.download = 'compressed_' + file.name;
                    a.textContent = '下载压缩后的图片';
                    document.body.appendChild(a);
                },
                error(err) {
                    console.error('压缩失败:', err.message);
                }
            });
        });
    </script>
</body>
</html>


实际项目中的应用

在实际业务中,我们通常需要把压缩后的图片上传到服务器。下面是一个完整的例子:

用户头像上传场景

class ImageUploader {
    constructor(options = {}) {
        this.maxWidth = options.maxWidth || 800;
        this.maxHeight = options.maxHeight || 800;
        this.quality = options.quality || 0.7;
    }

    // 压缩图片
    compressImage(file) {
        return new Promise((resolve, reject) => {
            new Compressor(file, {
                quality: this.quality,
                maxWidth: this.maxWidth,
                maxHeight: this.maxHeight,
                convertSize: 1000000, // 超过1MB的图片转换为JPEG
                success: resolve,
                error: reject
            });
        });
    }

    // 上传到服务器
    async uploadToServer(file) {
        try {
            const formData = new FormData();
            formData.append('avatar', file, file.name);

            const response = await fetch('/api/upload/avatar', {
                method: 'POST',
                body: formData
            });

            if (!response.ok) {
                throw new Error('上传失败');
            }

            return await response.json();
        } catch (error) {
            throw new Error('上传过程中出错: ' + error.message);
        }
    }

    // 处理文件选择
    async handleFileSelect(file) {
        if (!file) return;

        // 检查文件类型
        if (!file.type.startsWith('image/')) {
            alert('请选择图片文件');
            return;
        }

        // 检查文件大小(限制10MB)
        if (file.size > 10 * 1024 * 1024) {
            alert('图片大小不能超过10MB');
            return;
        }

        try {
            // 显示加载状态
            this.showLoading('正在压缩图片...');

            // 压缩图片
            const compressedFile = await this.compressImage(file);
            
            // 显示压缩信息
            this.showCompressionInfo(file, compressedFile);
            
            // 上传到服务器
            this.showLoading('正在上传...');
            const result = await this.uploadToServer(compressedFile);
            
            // 上传成功
            this.showSuccess('上传成功!');
            return result;
            
        } catch (error) {
            this.showError(error.message);
        } finally {
            this.hideLoading();
        }
    }

    showCompressionInfo(originalFile, compressedFile) {
        const originalSize = (originalFile.size / 1024).toFixed(2);
        const compressedSize = (compressedFile.size / 1024).toFixed(2);
        const ratio = ((compressedFile.size / originalFile.size) * 100).toFixed(1);
        
        console.log(`压缩前: ${originalSize}KB, 压缩后: ${compressedSize}KB, 体积减少: ${100 - ratio}%`);
    }

    showLoading(message) {
        // 实际项目中这里显示加载提示
        console.log(message);
    }

    hideLoading() {
        // 隐藏加载提示
    }

    showSuccess(message) {
        // 显示成功提示
        console.log(message);
    }

    showError(message) {
        // 显示错误提示
        console.error(message);
    }
}

// 使用示例
const uploader = new ImageUploader({
    maxWidth: 400,
    maxHeight: 400,
    quality: 0.6
});

// 绑定文件输入
document.getElementById('avatarInput').addEventListener('change', function(e) {
    uploader.handleFileSelect(e.target.files[0]);
});


高级配置选项

compressor.js提供了丰富的配置选项,可以根据不同场景调整:

const options = {
    // 压缩质量 (0到1之间)
    quality: 0.8,
    
    // 最大宽度
    maxWidth: 1920,
    
    // 最大高度  
    maxHeight: 1080,
    
    // 宽度(设置后会覆盖maxWidth)
    width: 800,
    
    // 高度(设置后会覆盖maxHeight)
    height: 600,
    
    // 是否保持图片宽高比
    strict: true,
    
    // 检查图片方向信息
    checkOrientation: true,
    
    // 保留图片的元数据
    retainExif: false,
    
    // 文件大小阈值,超过这个大小的PNG图片会转为JPEG
    convertSize: 1000000,
    
    // 输出文件类型
    mimeType: 'image/jpeg',
    
    // 成功回调
    success(result) {
        console.log('压缩成功', result);
    },
    
    // 错误回调
    error(err) {
        console.error('压缩失败', err);
    }
};


实际业务场景优化

1. 商品图片上传

class ProductImageProcessor {
    constructor() {
        this.sizes = [
            { name: 'large', width: 1200, quality: 0.8 },
            { name: 'medium', width: 600, quality: 0.7 },
            { name: 'small', width: 300, quality: 0.6 }
        ];
    }

    async processProductImage(file) {
        const results = {};
        
        for (const size of this.sizes) {
            const compressedFile = await this.compressToSize(file, size);
            results[size.name] = compressedFile;
        }
        
        return results;
    }

    compressToSize(file, sizeConfig) {
        return new Promise((resolve, reject) => {
            new Compressor(file, {
                width: sizeConfig.width,
                quality: sizeConfig.quality,
                mimeType: 'image/jpeg',
                success: resolve,
                error: reject
            });
        });
    }
}

2. 批量图片处理

async function processMultipleImages(files) {
    const compressedFiles = [];
    
    // 限制并发数量,避免浏览器卡顿
    const concurrentLimit = 3;
    
    for (let i = 0; i < files.length; i += concurrentLimit) {
        const batch = files.slice(i, i + concurrentLimit);
        const promises = batch.map(file => 
            new Promise((resolve) => {
                new Compressor(file, {
                    quality: 0.7,
                    maxWidth: 800,
                    success: resolve
                });
            })
        );
        
        const batchResults = await Promise.all(promises);
        compressedFiles.push(...batchResults);
        
        // 更新进度
        updateProgress(i + batch.length, files.length);
    }
    
    return compressedFiles;
}

function updateProgress(current, total) {
    const percent = Math.round((current / total) * 100);
    console.log(`处理进度: ${percent}%`);
}


性能优化建议

  1. 合理设置压缩质量:0.6-0.8的质量通常能在文件大小和图片质量间取得良好平衡

  2. 限制图片尺寸:根据实际显示需求设置maxWidth和maxHeight

  3. 批量处理控制并发:避免同时处理太多图片导致浏览器卡顿

  4. 提供进度反馈:让用户知道处理进度

  5. 错误处理:妥善处理压缩失败的情况


兼容性处理

虽然compressor.js基于现代浏览器特性,但我们可以添加降级方案:

async function safeCompress(file, options = {}) {
    // 检查浏览器是否支持
    if (!window.HTMLCanvasElement || 
        !HTMLCanvasElement.prototype.toBlob) {
        console.warn('浏览器不支持图片压缩,将上传原文件');
        return file;
    }
    
    try {
        return await new Promise((resolve, reject) => {
            new Compressor(file, {
                quality: options.quality || 0.7,
                maxWidth: options.maxWidth || 1920,
                maxHeight: options.maxHeight || 1080,
                success: resolve,
                error: reject
            });
        });
    } catch (error) {
        console.error('压缩失败,使用原文件:', error);
        return file;
    }
}


总结

compressor.js是一个实用且强大的前端图片压缩工具。它的主要优势在于:

  • 使用简单:几行代码就能集成

  • 效果明显:通常能减少60%-80%的文件体积

  • 用户体验好:压缩过程对用户透明

  • 节省资源:减少服务器存储和带宽消耗

在实际项目中,建议根据具体业务场景调整压缩参数,并在压缩质量和文件大小之间找到合适的平衡点。对于用户上传的图片,使用compressor.js进行前端压缩,既能提升用户体验,又能降低服务器成本,是一个双赢的选择。

仅供个人学习参考/导航指引使用,具体请以第三方网站说明为准,本站不提供任何专业建议。如果地址失效或描述有误,请联系站长反馈~感谢您的理解与支持!

链接: https://fly63.com/nav/4807

更多»
热门资源
swiper
目前应用较广泛的移动端网页触摸内容滑动js插件
官网
GitHub
layer
layer是一款口碑极佳的web弹层组件
点击进入
GitHub
iScroll.js
IScroll是移动页面上被使用的一款仿系统滚动插件。
官网
GitHub
wangEditor
基于javascript和css开发的 Web富文本编辑器
官网
GitHub
ueditor
由百度web前端研发部开发所见即所得富文本web编辑器
官网
GitHub
highlight
Highlight.js 是一个用 JavaScript 写的代码高亮插件,在客户端和服务端都能工作。
官网
GitHub
UglifyJS
一个js 解释器、最小化器、压缩器、美化器工具集
官网
GitHub
lozad.js
高性能,轻量级,可配置的懒加载图片工具
官网
GitHub
Sortable.js
简单灵活的 JavaScript 拖放排序插件
官网
GitHub
validate.js
表单提供了强大的验证功能,让客户端表单验证变得更简单
官网
GitHub
Draggin.js
一款兼容移动手机的js拖拽插件
官网
GitHub
lazysizes.js
响应式图像延迟加载JS插件【懒加载】
官网
GitHub
类似于compressor.js的资源
gridstack.js
创建漂亮的可拖动、可调整大小、响应式引导友好的布局
官网
GitHub
Liike.js
一款最小的js过渡动画库
官网
GitHub
vue3-infinite-list
一个支持百万数量级的Vue3无限滚动列表组件
点击进入
GitHub
nprogress
前端轻量级web进度条插件
官网
GitHub
react-swipeable-views
一个 React 轮播组件
官网
GitHub
bootstrap-table
Bootstrap Table显示数据表格格式
官网
GitHub
Mousetrap
一个简单、轻量可用于捕获和处理键盘事件的js 库
官网
GitHub
Simditor
一个基于浏览器所见即所得的文本编辑器
官网
GitHub
目录

手机扫一扫预览

》
分享组件加载中...
首页 技术导航 在线工具 技术文章 教程资源 前端标签 AI工具集 前端库/框架 实用工具箱 广告合作 关于我们

Copyright © 2018 Web前端开发网提供免费在线工具、编程学习资源(教程/框架/库),内容以学习参考为主,助您解决各类实际问题,快速提升专业能力。