GithubHelp home page GithubHelp logo

alextanhongpin / compress.js Goto Github PK

View Code? Open in Web Editor NEW
136.0 4.0 30.0 9.76 MB

A simple JavaScript based client-side image compression algorithm

License: MIT License

JavaScript 83.34% HTML 16.66%
compress base-conversion compression javascript javascript-client canvas fastest base64url base64 image

compress.js's Introduction

compress.js

A JavaScript client side image compression. This library uses the Canvas API to compress the image, and thus will not work on the node.js server-side.

Support me

Maintaining open source is not easy. Would be great if you could show some support!

"Buy Me A Coffee"

Advantage:

  • quick compression on the client-side
  • save data by compressing it on the client-side before sending to the server
  • mantains the aspect ratio of the images when resizing
  • fix image rotation issue when uploading images from Android an iOS
  • supports cropping the image
  • New: supports cropping to desired aspect ratio, e.g. 1:1, 4:3 etc

NOTE:

There are several limitations for this library:

  • When working with image/gif, the compressed image will no longer animate.
  • When working with image/png with transparent background, the compressed image will lose transparency and result in black background.

Installation

NPM Package here.

npm install compress.js --save

CDN

Using jsDelivr CDN:

Important

The script tag must include type="module" to work.

<!-- index.js is your file that needs to execute compress.js-->
<script src="./index.js" type="module"></script>

And in your index.js, you can import the desired version:

// index.js
"use strict";

import Compress from "https://cdn.jsdelivr.net/npm/[email protected]/build/compress.min.js";

const compressor = new Compress();

Import

const Compress = require('compress.js')

You can also include the build/compress.min.js in your project directory, and then importing it using type module in the script tag.

<!-- index.html -->
<script type="module" src="index.js"></script>
// index.js
import Compress from "./compress.min.js";

// ...

Demo

Try out our demo here.

Usage

import Compress from "./compress.min.js";

const compressor = new Compress();

// Listen to file upload events.
upload.addEventListener(
  "change",
  async function (evt) {
	const file = evt.target.files[0];
    const newFile = await compressor.compress(file, {
      quality: 0.95,
      crop: true, // If true, will crop a square image from the center.
      maxWidth: 320, // Image width will not exceed 320px.
      maxHeight: 320, // Image height will not exceed 320px.
    });

    // Display the image on the img element.
    img.src = URL.createObjectURL(newFile);
  },

compress.js's People

Contributors

alextanhongpin avatar corporateuser avatar craigcav avatar ucare-wuh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

compress.js's Issues

Cropp error

When I get another image and try to crop it without updating the page, a cropping error happens.
Cropp for the first time:
https://ibb.co/w40qzQK

Cropp for the second time without updating the page:
https://ibb.co/x8htNy4

It happens with the same or another image.

How to use this?

I just trying for a couple days but, why I can't upload compressed image or change image value in the html image input?

Why you use jpeg ?

Hi @alextanhongpin,

I want to know why you use exclusively the jpeg format to output the image ?
Why not png ?

It is possible to add param to custom that ?

Thanks.

Error when running jest

I'm getting an error when running jest

/node_modules/compress.js/src/index.js:2
    import "regenerator-runtime/runtime.js";
    ^^^^^^
SyntaxError: Cannot use import statement outside a module

import Compress from 'compress.js'

No idea what to do here.

Transparency lost on png images

Hi,

Thanks for this awesome library, it's very handy and simple.
However, if I try to compress a png image with transparency,
the transparent parts would turn into black as result.

Is there anyway to solve this?

Thanks for all the good works again!

P.S. This is what looks like on the demo page, the original image is here.
08_x_08_17-05-43

Facing issue in importing nextjs

When I try to use compress.js latest version i.e. 1.2.1 then it shows a build error that regenerator runtime cannot import from outside the module. Please look into it.

Exif orientation support broken with Safari 13.1 (iOS and Desktop)

In Safari 13.1 (released a few days ago on iOS as part of iOS 13.4.1), the EXIF orientation value is no longer being handled properly, and the compressed image that is output will not have the correct orientation.

I believe that this change in Webkit (used by Safari) is the source of the problem: https://bugs.webkit.org/show_bug.cgi?id=201123

The required action for this library would be to ignore the EXIF orientation value when on Safari 13.1 (or later).

The easiest way to reproduce this is to go to the https://davidmoodie.com/client-compress/ demo site using a Safari or Chome browser on a device running iOS 13.4.1 and attempt to upload the attached image. This image has orientation EXIF value of 3 (rotated 180 degrees).

The demo page will return the image rendered upside down. However, the same image on a device not running iOS 13.4.1 will return the image rendered with the proper orientation.

Demo-browser-on-iPhone-running-ios-13 4 1
IMG_2119

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.