Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

modulecssf

xkeshi14ISC1.0.17TypeScript support: included

sss

image, compress, lossy-compression, upload, orientation, javascript, front-end, web

readme

Compressor.js

Coverage Status Downloads Version Gzip Size

JavaScript image compressor. 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 a image on the client side before uploading it.

Table of contents

Main Files

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

Getting started

Install

npm install compressorjs

Usage

Syntax

new Compressor(file[, options])

file

The target image file for compressing.

options

  • Type: Object
  • Optional

The options for compressing. Check out the available options.

Example

<input type="file" id="file" accept="image/*">
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, {
    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);
    },
  });

});

⬆ back to top

Options

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).

strict

  • Type: boolean
  • Default: true

Indicates 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:

  • The retainExif option is set to true.
  • The mimeType option is set and its value is different from the mime type of the image.
  • The width option is set and its value is greater than the natural width of the image.
  • The height option is set and its value is greater than the natural height of the image.
  • The minWidth option is set and its value is greater than the natural width of the image.
  • The minHeight option is set and its value is greater than the natural height of the image.
  • The maxWidth option is set and its value is less than the natural width of the image.
  • The maxHeight option is set and its value is less than the natural height of the image.

checkOrientation

  • Type: boolean
  • Default: true

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

Notes:

  • Don't trust this all the time as some JPEG images have incorrect (not standard) Orientation values.
  • If the size of the target image is too large (e.g., greater than 10 MB), you should disable this option to avoid an out-of-memory crash.
  • The image's Exif information will be removed after compressed, so if you need the Exif information, you may need to upload the original image as well.

retainExif

  • Type: boolean
  • Default: false

Indicates whether to retain the image's Exif information after compressed.

maxWidth

  • Type: number
  • Default: Infinity

The 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.

maxHeight

  • Type: number
  • Default: Infinity

The max height of the output image. The value should be greater than 0.

minWidth

  • Type: number
  • Default: 0

The min-width of the output image. The value should be greater than 0 and should not be greater than the maxWidth.

minHeight

  • Type: number
  • Default: 0

The min-height of the output image. The value should be greater than 0 and should not be greater than the maxHeight.

width

  • Type: number
  • Default: undefined

The 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.

height

  • Type: number
  • Default: undefined

The 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.

resize

  • Type: string
  • Default: "none"
  • Options: "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.

quality

  • Type: number
  • Default: 0.8

The 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% -

mimeType

  • Type: string
  • Default: 'auto'
  • Options: "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.

convertTypes

  • Type: Array or string (multiple types should be separated by commas)
  • Default: ["image/png"]
  • Examples:
    • ["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 JPEGs.

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

convertSize

  • Type: number
  • Default: 5000000 (5 MB)

Files whose file type is included in the convertTypes list, and whose file size exceeds this value will be converted to JPEGs. To disable this, just set the value to 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)

  • Type: Function
  • Default: null
  • Parameters:
    • context: 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)

  • Type: Function
  • Default: null
  • Parameters:
    • context: 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)

  • Type: Function
  • Default: null
  • Parameters:
    • result: The compressed image (a File (read only) or Blob object).

The hook function to execute when successful to compress the image.

error(err)

  • Type: Function
  • Default: null
  • Parameters:
    • err: The compression error (an Error object).

The hook function executes when fails to compress the image.

⬆ back to top

Methods

abort()

Abort the compression process.

const compressor = new Compressor(file);

// Do something...
compressor.abort();

No conflict

If you have to use another compressor with the same namespace, just call the Compressor.noConflict static method to revert to it.

<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 (latest)
  • Firefox (latest)
  • Safari (latest)
  • Opera (latest)
  • Edge (latest)
  • Internet Explorer 10+

Contributing

Please read through our contributing guidelines.

Versioning

Maintained under the Semantic Versioning guidelines.

License

MIT © Chen Fengyuan

⬆ back to top

changelog

Changelog

0.18.0 (Feb 19, 2018)

  • Adding support for UNIX Sockets when running with Node.js (#1070)
  • Fixing typings (#1177):
    • AxiosRequestConfig.proxy: allows type false
    • AxiosProxyConfig: added auth field
  • Adding function signature in AxiosInstance interface so AxiosInstance can be invoked (#1192, #1254)
  • Allowing maxContentLength to pass through to redirected calls as maxBodyLength in follow-redirects config (#1287)
  • Fixing configuration when using an instance - method can now be set (#1342)

0.17.1 (Nov 11, 2017)

  • Fixing issue with web workers (#1160)
  • Allowing overriding transport (#1080)
  • Updating TypeScript typings (#1165, #1125, #1131)

0.17.0 (Oct 21, 2017)

  • BREAKING Fixing issue with baseURL and interceptors (#950)
  • BREAKING Improving handing of duplicate headers (#874)
  • Adding support for disabling proxies (#691)
  • Updating TypeScript typings with generic type parameters (#1061)

0.16.2 (Jun 3, 2017)

  • Fixing issue with including buffer in bundle (#887)
  • Including underlying request in errors (#830)
  • Convert method to lowercase (#930)

0.16.1 (Apr 8, 2017)

  • Improving HTTP adapter to return last request in case of redirects (#828)
  • Updating follow-redirects dependency (#829)
  • Adding support for passing Buffer in node (#773)

0.16.0 (Mar 31, 2017)

  • BREAKING Removing Promise from axios typings in favor of built-in type declarations (#480)
  • Adding options shortcut method (#461)
  • Fixing issue with using responseType: 'json' in browsers incompatible with XHR Level 2 (#654)
  • Improving React Native detection (#731)
  • Fixing combineURLs to support empty relativeURL (#581)
  • Removing PROTECTION_PREFIX support (#561)

0.15.3 (Nov 27, 2016)

  • Fixing issue with custom instances and global defaults (#443)
  • Renaming axios.d.ts to index.d.ts (#519)
  • Adding get, head, and delete to defaults.headers (#509)
  • Fixing issue with btoa and IE (#507)
  • Adding support for proxy authentication (#483)
  • Improving HTTP adapter to use http protocol by default (#493)
  • Fixing proxy issues (#491)

0.15.2 (Oct 17, 2016)

  • Fixing issue with calling cancel after response has been received (#482)

0.15.1 (Oct 14, 2016)

  • Fixing issue with UMD (#485)

0.15.0 (Oct 10, 2016)

  • Adding cancellation support (#452)
  • Moving default adapter to global defaults (#437)
  • Fixing issue with file URI scheme (#440)
  • Fixing issue with params objects that have no prototype (#445)

0.14.0 (Aug 27, 2016)

  • BREAKING Updating TypeScript definitions (#419)
  • BREAKING Replacing agent option with httpAgent and httpsAgent (#387)
  • BREAKING Splitting progress event handlers into onUploadProgress and onDownloadProgress (#423)
  • Adding support for http_proxy and https_proxy environment variables (#366)
  • Fixing issue with auth config option and Authorization header (#397)
  • Don't set XSRF header if xsrfCookieName is null (#406)

0.13.1 (Jul 16, 2016)

  • Fixing issue with response data not being transformed on error (#378)

0.13.0 (Jul 13, 2016)

  • BREAKING Improved error handling (#345)
  • BREAKING Response transformer now invoked in dispatcher not adapter (10eb238)
  • BREAKING Request adapters now return a Promise (157efd5)
  • Fixing issue with withCredentials not being overwritten (#343)
  • Fixing regression with request transformer being called before request interceptor (#352)
  • Fixing custom instance defaults (#341)
  • Fixing instances created from axios.create to have same API as default axios (#217)

0.12.0 (May 31, 2016)

  • Adding support for URLSearchParams (#317)
  • Adding maxRedirects option (#307)

0.11.1 (May 17, 2016)

  • Fixing IE CORS support (#313)
  • Fixing detection of FormData (#325)
  • Adding Axios class to exports (#321)

0.11.0 (Apr 26, 2016)

  • Adding support for Stream with HTTP adapter (#296)
  • Adding support for custom HTTP status code error ranges (#308)
  • Fixing issue with ArrayBuffer (#299)

0.10.0 (Apr 20, 2016)

  • Fixing issue with some requests sending undefined instead of null (#250)
  • Fixing basic auth for HTTP adapter (#252)
  • Fixing request timeout for XHR adapter (#227)
  • Fixing IE8 support by using onreadystatechange instead of onload (#249)
  • Fixing IE9 cross domain requests (#251)
  • Adding maxContentLength option (#275)
  • Fixing XHR support for WebWorker environment (#279)
  • Adding request instance to response (#200)

0.9.1 (Jan 24, 2016)

  • Improving handling of request timeout in node (#124)
  • Fixing network errors not rejecting (#205)
  • Fixing issue with IE rejecting on HTTP 204 (#201)
  • Fixing host/port when following redirects (#198)

0.9.0 (Jan 18, 2016)

  • Adding support for custom adapters
  • Fixing Content-Type header being removed when data is false (#195)
  • Improving XDomainRequest implementation (#185)
  • Improving config merging and order of precedence (#183)
  • Fixing XDomainRequest support for only <= IE9 (#182)

0.8.1 (Dec 14, 2015)

  • Adding support for passing XSRF token for cross domain requests when using withCredentials (#168)
  • Fixing error with format of basic auth header (#178)
  • Fixing error with JSON payloads throwing InvalidStateError in some cases (#174)

0.8.0 (Dec 11, 2015)

  • Adding support for creating instances of axios (#123)
  • Fixing http adapter to use Buffer instead of String in case of responseType === 'arraybuffer' (#128)
  • Adding support for using custom parameter serializer with paramsSerializer option (#121)
  • Fixing issue in IE8 caused by forEach on arguments (#127)
  • Adding support for following redirects in node (#146)
  • Adding support for transparent decompression if content-encoding is set (#149)
  • Adding support for transparent XDomainRequest to handle cross domain requests in IE9 (#140)
  • Adding support for HTTP basic auth via Authorization header (#167)
  • Adding support for baseURL option (#160)

0.7.0 (Sep 29, 2015)

  • Fixing issue with minified bundle in IE8 (#87)
  • Adding support for passing agent in node (#102)
  • Adding support for returning result from axios.spread for chaining (#106)
  • Fixing typescript definition (#105)
  • Fixing default timeout config for node (#112)
  • Adding support for use in web workers, and react-native (#70), (#98)
  • Adding support for fetch like API axios(url[, config]) (#116)

0.6.0 (Sep 21, 2015)

  • Removing deprecated success/error aliases
  • Fixing issue with array params not being properly encoded (#49)
  • Fixing issue with User-Agent getting overridden (#69)
  • Adding support for timeout config (#56)
  • Removing es6-promise dependency
  • Fixing issue preventing length to be used as a parameter (#91)
  • Fixing issue with IE8 (#85)
  • Converting build to UMD

0.5.4 (Apr 08, 2015)

  • Fixing issue with FormData not being sent (#53)

0.5.3 (Apr 07, 2015)

  • Using JSON.parse unconditionally when transforming response string (#55)

0.5.2 (Mar 13, 2015)

  • Adding support for statusText in response (#46)

0.5.1 (Mar 10, 2015)

  • Fixing issue using strict mode (#45)
  • Fixing issue with standalone build (#47)

0.5.0 (Jan 23, 2015)

  • Adding support for intercepetors (#14)
  • Updating es6-promise dependency

0.4.2 (Dec 10, 2014)

  • Fixing issue with Content-Type when using FormData (#22)
  • Adding support for TypeScript (#25)
  • Fixing issue with standalone build (#29)
  • Fixing issue with verbs needing to be capitalized in some browsers (#30)

0.4.1 (Oct 15, 2014)

  • Adding error handling to request for node.js (#18)

0.4.0 (Oct 03, 2014)

  • Adding support for ArrayBuffer and ArrayBufferView (#10)
  • Adding support for utf-8 for node.js (#13)
  • Adding support for SSL for node.js (#12)
  • Fixing incorrect Content-Type header (#9)
  • Adding standalone build without bundled es6-promise (#11)
  • Deprecating success/error in favor of then/catch

0.3.1 (Sep 16, 2014)

  • Fixing missing post body when using node.js (#3)

0.3.0 (Sep 16, 2014)

  • Fixing success and error to properly receive response data as individual arguments (#8)
  • Updating then and catch to receive response data as a single object (#6)
  • Fixing issue with all not working (#7)

0.2.2 (Sep 14, 2014)

  • Fixing bundling with browserify (#4)

0.2.1 (Sep 12, 2014)

  • Fixing build problem causing ridiculous file sizes

0.2.0 (Sep 12, 2014)

  • Adding support for all and spread
  • Adding support for node.js (#1)

0.1.0 (Aug 29, 2014)

  • Initial release