image-compressor: 前端图片压缩库

2025年10月20日 13:42:20
21016
file-upload image-compression image-compressor javascript 图片压缩

项目结构

📌 compressorjs fengyuanchen/compressorjs

超轻量的前端图片压缩库,就像一个智能“图片瘦身教练”,能在浏览器里直接把大图片压缩到合适大小,而且不影响视觉效果。 • 压缩后仅20KB,比一张表情包还小 • 支持JPEG、PNG、WebP等主流格式 • 零依赖,原生JavaScript编写 • 每周下载量稳定在10万+

项目大小 350.03 KB
涉及语言 JavaScript 99.82% Shell 0.18%
许可协议 MIT License

Compressor.js

Coverage Status Downloads Version Gzip Size

JavaScript image compressor. Uses the Browser’s native HTMLCanvasElement.toBlob() 方法来做压缩工作,这意味着它是有损压缩, 异步, 并且 has 不同浏览器中的不同压缩效果.通常,在上传图像之前,请使用它在客户端对其进行预压缩。

目录

Main Files

1
2
3
4
5
dist/
├── compressor.js        (UMD)
├── compressor.min.js    (UMD, compressed)
├── compressor.common.js (CommonJS, default)
└── compressor.esm.js    (ES Module)

Getting started

安装

1
npm install compressorjs

使用说明

语法

1
new Compressor(file[, options])

file

的 target image file for compressing.

options

  • Type: Object
  • 自选

压缩选项。查看可用的 options.

1
<input type="file">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import axios from 'axios';
import Compressor from 'compressorjs';
 
document.getElementById('file').addEventListener('change', (e) => {
  const file = e.target.files[0];
 
  if (!file) {
    return;
  }
 
  new Compressor(file, {
    质量: 0.6,
 
    // The compression process is asynchronous,
    // which means you have to access the `result` in the `success` hook function.
    success(结果) {
      const formData = new FormData();
 
      // The third parameter is required for server
      formData.append('file', result, result.name);
 
      // Send the compressed image file to server with XMLHttpRequest.
      axios.post('/path/to/upload', formData).then(() => {
        console.log('Upload success');
      });
    },
    错误(错误) {
      console.log(err.message);
    },
  });
 
});

⬆ back to top

Options

您可以使用以下命令设置压缩器选项 new Compressor(file, options).
如果要更改全局默认选项,您可以使用 Compressor.setDefaults(options).

严格

  • Type: boolean
  • 违约: true

表示当压缩图像的大小大于原始图像时,是否输出原始图像而不是压缩图像,但以下情况除外:

  • The 保留Exif 选项设置为true.
  • The mime类型 选项,并且其值与图像的 MIME 类型不同。
  • The 宽度 选项,其值大于图像的自然宽度。
  • The 高度 选项,其值大于图像的自然高度。
  • The 最小宽度 option is set and its value is greater than the natural width of the image.
  • The 最小高度 option is set and its value is greater than the natural height of the image.
  • The 最大宽度 选项,其值小于图像的自然宽度。
  • The 最大高度 选项,其值小于图像的自然高度。

checkOrientation

  • Type: boolean
  • Default: true

Indicates whether to read the image’s Exif Orientation value (JPEG image only),和 then rotate or flip the image automatically with the value.

笔记:

  • 不要一直相信这一点,因为某些 JPEG 图像具有不正确(非标准)方向值。
  • 如果目标图像的大小太大(例如,大于 10 MB),则应禁用此选项以避免内存不足崩溃。
  • 图像的 Exif 信息将在压缩后被删除,因此如果您需要 Exif 信息,您可能还需要上传原始图像。

retainExif

  • Type: boolean
  • Default: false

表示压缩后是否保留图像的Exif信息。

maxWidth

  • Type: number
  • Default: Infinity

输出图像的最大宽度。该值应大于 0.

Avoid getting a blank output image, you might need to set the maxWidth and maxHeight 选项到有限的数量,因为the size limits of a canvas element,推荐使用 4096 或更少。

maxHeight

  • Type: number
  • Default: Infinity

输出图像的最大高度。该值应大于 0.

minWidth

  • Type: number
  • Default: 0

输出图像的最小宽度。该值应大于 0 并且不应大于maxWidth.

minHeight

  • Type: number
  • Default: 0

输出图像的最小高度。该值应大于 0 and should not be greater than the maxHeight.

width

  • Type: number
  • Default: undefined

输出图像的宽度。如果未指定,则将使用原始图像的自然宽度,或者如果 height 选项,则宽度将按自然纵横比自动计算。

height

  • Type: number
  • Default: undefined

输出图像的高度。如果未指定,则将使用原始图像的自然高度,或者如果 width 选项,则高度将通过自然纵横比自动计算。

调整

  • Type: string
  • Default: "none"
  • 选项: "none", "contain", and "cover".

设置如何将图像的大小调整为 width and height 选项。

注意: 仅当width and height 选项。

quality

  • Type: number
  • Default: 0.8

输出图像的质量。它必须是介于 0 and 1.如果此参数是其他任何参数,则默认值 0.92 and 0.80 用于image/jpeg and image/webp 分别。其他参数将被忽略。小心使用1 因为它可能会使输出图像的大小变大。

Note: 此选项仅适用于image/jpeg and image/webp 图像。

Check out the documentation of the HTMLCanvasElement.toBlob() 方法了解更多详情。

示例:

质量 输入大小 输出大小 压缩比 描述
0 2.12 兆字节 114.61 KB 94.72% -
0.2 2.12 MB 349.57 KB 83.90% -
0.4 2.12 MB 517.10 KB 76.18% -
0.6 2.12 MB 694.99 KB 67.99% 推荐
0.8 2.12 MB 1.14 兆字节 46.41% Recommend
1 2.12 MB 2.12 MB 0% 不推荐
2.12 MB 2.01 兆字节 5.02% -

mimeType

  • Type: string
  • Default: 'auto'
  • Options: "auto", "image/png", "image/jpeg", and "image/webp".

输出图像的 MIME 类型。默认情况下,将使用源图像文件的原始 MIME 类型。

Note: Safari 不支持mimeType 转换为"image/webp".有关更多详细信息,请参阅 browser compatibility of the HTMLCanvasElement.toBlob() method.

转换类型

  • Type: Array or string (多种类型应用逗号分隔)
  • Default: ["image/png"]
  • 例子:
    • ["image/png", "image/webp"]
    • "image/png,image/webp"

文件类型包含在此列表中且文件大小超过 转换大小 值将转换为 JPEG。

For image file type support, see the Image file type and format guide.

convertSize

  • Type: number
  • Default: 5000000 (5 兆字节)

文件类型包含在 convertTypes 列表,其文件大小超过此值将转换为 JPEG。要禁用此功能,只需将值设置为Infinity.

Examples:

convertSize 输入尺寸(类型) 输出尺寸(类型) Compression ratio
5 MB 1.87 MB (PNG) 1.87 MB (PNG) 0%
5 MB 5.66 MB (PNG) 450.24 KB (JPEG) 92.23%
5 MB 9.74 MB (PNG) 883.89 KB (JPEG) 91.14%

beforeDraw(上下文,画布)

  • Type: Function
  • Default: null
  • 参数:
    • context:画布的 2D 渲染上下文。
    • canvas:用于压缩的画布。

在将图像绘制到画布中进行压缩之前要执行的钩子函数。

1
2
3
4
5
6
7
new Compressor(file, {
  beforeDraw(context, canvas) {
    context.fillStyle = '#fff';
    context.fillRect(0, 0, canvas.width, canvas.height);
    context.filter = 'grayscale(100%)';
  },
});

drew(上下文,画布)

  • Type: Function
  • Default: null
  • Parameters:
    • context: The 2d rendering context of the canvas.
    • canvas: The canvas for compression.

将图像绘制到画布中进行压缩后执行的钩子函数。

1
2
3
4
5
6
7
new Compressor(file, {
  drew(context, canvas) {
    context.fillStyle = '#fff';
    context.font = '2rem serif';
    context.fillText('watermark', 20, canvas.height - 20);
  },
});

success(result)

  • Type: Function
  • Default: null
  • Parameters:
    • result:压缩图像( File (只读) 或 Blob 对象)。

成功压缩图像时要执行的钩子函数。

error(err)

  • Type: Function
  • Default: null
  • Parameters:
    • err:压缩误差( Error object).

hook 函数在压缩图像失败时执行。

⬆ back to top

Methods

中止()

中止压缩过程。

1
2
3
4
const compressor = new Compressor(file);
 
// Do something...
compressor.abort();

No conflict

如果您必须使用具有相同命名空间的另一个压缩器,只需调用 Compressor.noConflict static 方法来恢复它。

1
2
3
4
5
6
<script src="other-compressor.js">script>
<script src="compressor.js">script>
<script>
  Compressor.noConflict();
  // Code that uses other `Compressor` can follow here.
script>

Browser support

  • Chrome(最新)
  • Firefox(最新)
  • Safari(最新)
  • 歌剧(最新)
  • 边缘(最新)
  • Internet Explorer 10+

Contributing

请通读我们的 contributing guidelines.

Versioning

根据 Semantic Versioning guidelines.

License

MIT © Chen Fengyuan

⬆ back to top

免责声明 © 2025 - 虚宝阁

本站部分源码来源于网络,版权归属原开发者,用户仅获得使用权。依据《计算机软件保护条例》第十六条,禁止:

  • 逆向工程破解技术保护措施
  • 未经许可的分发行为
  • 去除源码中的原始版权标识

※ 本站源码仅用于学习和研究,禁止用于商业用途。如有侵权, 请及时联系我们进行处理。

侵权举报请提供: 侵权页面URL | 权属证明模板

响应时效:收到完整材料后48小时内处理

相关推荐

squish: 基于浏览器的图像压缩工具

一个现代、基于浏览器的图像压缩工具,结合了现代Web技术和WebAssembly的性能优势,为开发者提供了便捷的图像优化解决方案。无论是处理个人照片还是批量优化网站资源,Squish都能满足多样化的需求。

1022 2025-10-05

ImageMagick: 图片处理瑞士军刀

ImageMagick是开源的命令行图片工具,压缩图片、转格式、加水印、切图都能一行命令搞定,还能批量处理如把100张图片批量压缩成WebP格式,自媒体、开发者都能用。

14651 2025-09-16

OpenIsle- 轻量级的Java开源社区系统

这是一个基于 Spring Boot 和 Vue3 构建的开源自由社区系统,定位为轻量级的 Discourse。它完全开源、可二次开发,支持白名单邀请、自定义标签、实时通知等功能。

393 2025-09-13

Claudable:基于 Next.js 框架的网站生成器

把你用自然语言描述的应用想法,直接变成可以运行的网站代码。Claudable 背后依赖强大的 AI 编程助手,主要是 Claude Code,也支持 Cursor CLI 来理解你的需求并生成代码。你不需要懂复杂的 API 设置、数据库配置或者部署流程:用简单的语言告诉 Claudable 你想要什么应用。

2525 2025-09-15

drawnix

开源白板工具(SaaS),一体化白板,包含思维导图、流程图、自由画等。All in one open-source whiteboard tool with mind, flowchart, freehand and etc.

11913 2025-08-28

NBlog: 开源博客系统

一个前后端分离的开源博客系统,基于 Spring Boot + Vue 技术栈开发,界面清新简洁,拥有多个丰富的博客组件,自带管理后台。

2636 2025-09-16

AI-Media2Doc: AI 视频图文创作助手

一键将音视频转化为小红书/公众号/知识笔记/思维导图/视频字幕等各种风格的文档。

2513 2025-09-25