What is browser-image-compression?
The browser-image-compression npm package is a JavaScript library that allows you to compress images directly in the browser. It is useful for reducing the file size of images before uploading them to a server, which can save bandwidth and improve performance.
What are browser-image-compression's main functionalities?
Compress Image
This feature allows you to compress an image file to a specified size and dimension. The code sample demonstrates how to use the package to compress an image file with a maximum size of 1MB and a maximum width or height of 1920 pixels.
const imageCompression = require('browser-image-compression');
async function compressImage(file) {
const options = {
maxSizeMB: 1,
maxWidthOrHeight: 1920,
useWebWorker: true
};
try {
const compressedFile = await imageCompression(file, options);
console.log('Compressed file:', compressedFile);
} catch (error) {
console.error('Error compressing image:', error);
}
}
Get Image File from URL
This feature allows you to fetch an image from a URL and convert it into a File object. The code sample demonstrates how to fetch an image from a URL and create a File object from the fetched Blob.
const imageCompression = require('browser-image-compression');
async function getImageFileFromUrl(url) {
try {
const response = await fetch(url);
const blob = await response.blob();
const file = new File([blob], 'image.jpg', { type: blob.type });
console.log('Image file:', file);
} catch (error) {
console.error('Error fetching image:', error);
}
}
Draw Image on Canvas
This feature allows you to draw an image on a canvas element. The code sample demonstrates how to read an image file, create an Image object, and draw it on a canvas element.
const imageCompression = require('browser-image-compression');
function drawImageOnCanvas(file) {
const img = new Image();
const reader = new FileReader();
reader.onload = function (e) {
img.src = e.target.result;
img.onload = function () {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
document.body.appendChild(canvas);
};
};
reader.readAsDataURL(file);
}
Other packages similar to browser-image-compression
compressorjs
Compressor.js is a JavaScript library for image compression. It provides a simple API for compressing images in the browser. Compared to browser-image-compression, Compressor.js offers more customization options for the compression process, such as setting the quality and resizing the image.
pica
Pica is a high-quality image resizing library that works in the browser. It focuses on providing high-quality image resizing with a fast performance. While it does not specifically focus on compression, it can be used to resize images before compressing them with another library like browser-image-compression.
image-shrink
Image-shrink is a lightweight JavaScript library for compressing images in the browser. It provides a simple API for reducing the file size of images. Compared to browser-image-compression, image-shrink is more lightweight but may not offer as many features or customization options.
Browser Image Compression

Javascript module to be run in the web browser for image compression.
Features
- You can use this module to compress jpeg and png image by reducing resolution or storage size before uploading to application server to save bandwidth.
- Multi-thread (web worker) non-blocking compression are supported through options.
Install
You can download imageCompression from the dist folder. Alternatively, you can install it via yarn or npm
npm install browser-image-compression --save
or
yarn add browser-image-compression
or use a CDN like delivrjs:
https://cdn.jsdelivr.net/npm/browser-image-compression@1.0.13/dist/browser-image-compression.js
or
https://cdn.jsdelivr.net/npm/browser-image-compression@latest/dist/browser-image-compression.js
How to use this module in your project?
Use as ES module
(can be used in framework like React, Angular, Vue etc)
(work with bundler like webpack and rollup)
import imageCompression from 'browser-image-compression';
or
In html file
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/browser-image-compression@1.0.13/dist/browser-image-compression.js"></script>
API
Main function
const options = {
maxSizeMB: number,
maxWidthOrHeight: number,
onProgress: Function,
useWebWorker: boolean,
maxIteration: number,
exifOrientation: number,
fileType: string,
initialQuality: number
}
imageCompression(file: File, options): Promise<File | Blob>
Helper function
- for advanced user only, most user won't need to use the helper functions
imageCompression.getDataUrlFromFile(file: File | Blob): Promise<base64 encoded string>
imageCompression.getFilefromDataUrl(dataUrl: string, filename: string, lastModified?: number): Promise<File>
imageCompression.loadImage(url: string): Promise<HTMLImageElement>
imageCompression.drawImageInCanvas(img: HTMLImageElement): HTMLCanvasElement | OffscreenCanvas
imageCompression.drawFileInCanvas(file: File| Blob): Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement | OffscreenCanvas]>
imageCompression.canvasToFile(canvas: HTMLCanvasElement | OffscreenCanvas, fileType: string, fileName: string, fileLastModified: number, quality?: number): Promise<File | Blob>
imageCompression.getExifOrientation(file: File| Blob): Promise<number>
Usage
<input type="file" accept="image/*" onchange="handleImageUpload(event);">
async await syntax:
async function handleImageUpload(event) {
const imageFile = event.target.files[0];
console.log('originalFile instanceof Blob', imageFile instanceof Blob);
console.log(`originalFile size ${imageFile.size / 1024 / 1024} MB`);
const options = {
maxSizeMB: 1,
maxWidthOrHeight: 1920,
useWebWorker: true
}
try {
const compressedFile = await imageCompression(imageFile, options);
console.log('compressedFile instanceof Blob', compressedFile instanceof Blob);
console.log(`compressedFile size ${compressedFile.size / 1024 / 1024} MB`);
await uploadToServer(compressedFile);
} catch (error) {
console.log(error);
}
}
Promise.then().catch() syntax:
function handleImageUpload(event) {
var imageFile = event.target.files[0];
console.log('originalFile instanceof Blob', imageFile instanceof Blob);
console.log(`originalFile size ${imageFile.size / 1024 / 1024} MB`);
var options = {
maxSizeMB: 1,
maxWidthOrHeight: 1920,
useWebWorker: true
}
imageCompression(imageFile, options)
.then(function (compressedFile) {
console.log('compressedFile instanceof Blob', compressedFile instanceof Blob);
console.log(`compressedFile size ${compressedFile.size / 1024 / 1024} MB`);
return uploadToServer(compressedFile);
})
.catch(function (error) {
console.log(error.message);
});
}
Demo / Example
open https://donaldcwl.github.io/browser-image-compression/example/basic.html
or check the "example" folder in this repo
Browsers support
IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
IE support
Promise API is being used in this library. If you need to support browser that do not support Promise like IE. You can include the Promise polyfill in your project.
See: https://github.com/taylorhakes/promise-polyfill
You can include the following script to load the Promise polyfill:
<script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script>
Typescript type definitions
npm install --save-dev @types/browser-image-compression
or
yarn add --dev @types/browser-image-compression
Contribution
- fork the repo and git clone it
- run
npm run watch
# it will watch code change in lib/ folder and generate js in dist/ folder
- add/update code in lib/ folder
- try the code by opening example/development.html which will load the js in dist/ folder
- add/update test in test/ folder
npm run test
- push to your forked repo on github
- make a pull request to this repo