
Security News
AI Agent Lands PRs in Major OSS Projects, Targets Maintainers via Cold Outreach
An AI agent is merging PRs into major OSS projects and cold-emailing maintainers to drum up more work.
compressorjs-next
Advanced tools
Modernized, optimized, and maintained fork of Fengyuan Chen’s Compressor.js.
A JavaScript image compressor and converter. Uses the browser’s native HTMLCanvasElement.toBlob() method to do the compression work, which means it is lossy compression, asynchronous, and has different compression effects in different browsers. Generally use this to precompress an image on the client side before uploading it.
Change the package name from compressorjs to compressorjs-next in your package.json and imports (import Compressor from 'compressorjs-next').
The API is otherwise the same, with these exceptions (as of 1.1.0—follow the changelog from there):
noConflict() method has been removedconvertTypes has changed from ['image/png'] to []dist/
├── compressor.js (UMD)
├── compressor.min.js (UMD, compressed)
├── compressor.esm.js (ES Module, default)
└── compressor.common.js (CommonJS)
npm i compressorjs-next
new Compressor(file[, options])
file
The target image file for compressing.
options
ObjectThe options for compressing. Check out the available options.
<input type="file" id="file" accept="image/*">
import axios from 'axios';
import Compressor from 'compressorjs-next';
document.getElementById('file').addEventListener('change', (e) => {
const file = e.target.files[0];
if (!file) {
return;
}
new Compressor(file, {
quality: 0.6,
// The compression process is asynchronous,
// which means you have to access the `result` in the `success` hook function.
success(result) {
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');
});
},
error(err) {
console.log(err.message);
},
});
});
You may set compressor options with new Compressor(file, options).
If you want to change the global default options, You may use Compressor.setDefaults(options).
strictbooleantrueIndicates whether to output the original image instead of the compressed one when the size of the compressed image is greater than the original one’s, except the following cases:
retainExif option is set to true.mimeType option is set and its value is different from the mime type of the image.width option is set and its value is greater than the natural width of the image.height option is set and its value is greater than the natural height of the image.minWidth option is set and its value is greater than the natural width of the image.minHeight option is set and its value is greater than the natural height of the image.maxWidth option is set and its value is less than the natural width of the image.maxHeight option is set and its value is less than the natural height of the image.checkOrientationbooleantrueIndicates whether to read the image’s Exif Orientation value (JPEG image only), and then rotate or flip the image automatically with the value.
Notes:
Orientation values.retainExifbooleanfalseIndicates whether to retain the image’s Exif information after compressed.
maxWidthnumberInfinityThe max width of the output image. The value should be greater than 0.
Avoid getting a blank output image, you might need to set the maxWidth and maxHeight options to limited numbers, because of the size limits of a canvas element, recommend to use 4096 or lesser.
maxHeightnumberInfinityThe max height of the output image. The value should be greater than 0.
minWidthnumber0The min width of the output image. The value should be greater than 0 and should not be greater than the maxWidth.
minHeightnumber0The min height of the output image. The value should be greater than 0 and should not be greater than the maxHeight.
widthnumberundefinedThe width of the output image. If not specified, the natural width of the original image will be used, or if the height option is set, the width will be computed automatically by the natural aspect ratio.
heightnumberundefinedThe height of the output image. If not specified, the natural height of the original image will be used, or if the width option is set, the height will be computed automatically by the natural aspect ratio.
resizestring"none""none", "contain", and "cover"Sets how the size of the image should be resized to the container specified by the width and height options.
Note: This option only available when both the width and height options are specified.
qualitynumber0.8The quality of the output image. It must be a number between 0 and 1. If this argument is anything else, the default values 0.92 and 0.80 are used for image/jpeg and image/webp respectively. Other arguments are ignored. Be careful to use 1 as it may make the size of the output image become larger.
Note: This option only available for image/jpeg and image/webp images.
Check out the documentation of the HTMLCanvasElement.toBlob() method for more detail.
Examples:
quality | Input size | Output size | Compression ratio | Description |
|---|---|---|---|---|
| 0 | 2.12 MB | 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% | Recommend |
| 0.8 | 2.12 MB | 1.14 MB | 46.41% | Recommend |
| 1 | 2.12 MB | 2.12 MB | 0% | Not recommend |
| NaN | 2.12 MB | 2.01 MB | 5.02% | — |
mimeTypestring'auto'"auto", "image/png", "image/jpeg", and "image/webp"The MIME type of the output image. By default, the original MIME type of the source image file will be used.
Note: Safari does not support mimeType conversion to "image/webp". For more details, see the browser compatibility of the HTMLCanvasElement.toBlob() method.
convertTypesArray or string (multiple types should be separated by commas)[]["image/png", "image/webp"]"image/png,image/webp"Files whose file type is included in this list and whose file size exceeds the convertSize value will be converted to JPEG.
For image file type support, see the Image file type and format guide.
convertSizenumber5000000 (5 MB)Files whose file type is included in the convertTypes list and whose file size exceeds this value will be converted to JPEG. Can also be disabled through the value Infinity.
Examples:
convertSize | Input size (type) | Output size (type) | 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(context, canvas)Functionnullcontext: The 2d rendering context of the canvas.canvas: The canvas for compression.The hook function to execute before drawing the image into the canvas for compression.
new Compressor(file, {
beforeDraw(context, canvas) {
context.fillStyle = '#fff';
context.fillRect(0, 0, canvas.width, canvas.height);
context.filter = 'grayscale(100%)';
},
});
drew(context, canvas)Functionnullcontext: The 2d rendering context of the canvas.canvas: The canvas for compression.The hook function to execute after drawing the image into the canvas for compression.
new Compressor(file, {
drew(context, canvas) {
context.fillStyle = '#fff';
context.font = '2rem serif';
context.fillText('watermark', 20, canvas.height - 20);
},
});
success(result)Functionnullresult: The compressed image (a File (read only) or Blob object).The hook function to execute when successful to compress the image.
error(err)Functionnullerr: The compression error (an Error object).The hook function executes when fails to compress the image.
abort()Abort the compression process.
const compressor = new Compressor(file);
// Do something…
compressor.abort();
Supports browserslist defaults.
Note: When the browser’s canvas produces unreliable pixel data—as with Firefox’s privacy.resistFingerprinting setting or privacy-focused forks like LibreWolf—, compression, resizing, and format conversion are not possible. In this case, the library falls back to returning the original image with EXIF data stripped (JPEG) or unchanged (other formats).
FAQs
JavaScript image compressor and converter
The npm package compressorjs-next receives a total of 356 weekly downloads. As such, compressorjs-next popularity was classified as not popular.
We found that compressorjs-next demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
An AI agent is merging PRs into major OSS projects and cold-emailing maintainers to drum up more work.

Research
/Security News
Chrome extension CL Suite by @CLMasters neutralizes 2FA for Facebook and Meta Business accounts while exfiltrating Business Manager contact and analytics data.

Security News
After Matplotlib rejected an AI-written PR, the agent fired back with a blog post, igniting debate over AI contributions and maintainer burden.