react-image-crop vs cropperjs vs ngx-image-cropper vs react-easy-crop
Image Cropping Libraries
react-image-cropcropperjsngx-image-cropperreact-easy-cropSimilar Packages:

Image Cropping Libraries

Image cropping libraries are essential tools in web development that allow developers to implement image editing functionalities, specifically cropping, within their applications. These libraries provide a user-friendly interface for users to select and crop images, ensuring that images are displayed in the desired dimensions and aspect ratios. They are particularly useful in applications that require user-uploaded images, such as profile pictures, product images, and social media platforms. Each library offers unique features and integration capabilities, catering to different frameworks and use cases.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
react-image-crop1,040,4914,086112 kB72a year agoISC
cropperjs013,810440 kB425 months agoMIT
ngx-image-cropper0811546 kB92 months agoMIT
react-easy-crop02,694541 kB244 months agoMIT

Feature Comparison: react-image-crop vs cropperjs vs ngx-image-cropper vs react-easy-crop

Framework Compatibility

  • react-image-crop:

    react-image-crop is designed for React and offers a more complex set of features, making it suitable for developers who need advanced cropping capabilities within their React applications.

  • cropperjs:

    CropperJS is a framework-agnostic library that can be integrated into any web project, making it versatile for various applications regardless of the underlying technology stack.

  • ngx-image-cropper:

    ngx-image-cropper is specifically built for Angular applications, leveraging Angular's features such as reactive forms and dependency injection, ensuring a smooth integration experience for Angular developers.

  • react-easy-crop:

    react-easy-crop is tailored for React applications, providing a simple API that aligns with React's component-based architecture, making it easy to implement and manage within React projects.

User Interface

  • react-image-crop:

    react-image-crop provides a more feature-rich interface with options for aspect ratio control and image previews, catering to users who require more advanced cropping functionalities.

  • cropperjs:

    CropperJS provides a highly customizable user interface that allows developers to style the cropping tool to match their application's design. It offers a variety of options for customizing the appearance and behavior of the cropping tool.

  • ngx-image-cropper:

    ngx-image-cropper offers a user-friendly interface that is consistent with Angular's design principles, making it easy for users to interact with the cropping tool while maintaining a familiar look and feel within Angular applications.

  • react-easy-crop:

    react-easy-crop focuses on simplicity and ease of use, providing a clean and intuitive interface that allows users to crop images effortlessly, with support for touch gestures and responsive design.

Customization Options

  • react-image-crop:

    react-image-crop offers a range of customization options, including aspect ratio control and image preview features, making it suitable for applications that require detailed cropping functionalities.

  • cropperjs:

    CropperJS offers extensive customization options, including aspect ratio settings, crop box dimensions, and event callbacks, allowing developers to tailor the cropping experience to their specific needs.

  • ngx-image-cropper:

    ngx-image-cropper provides basic customization options suitable for most Angular applications, but it may not offer the same level of flexibility as CropperJS for highly specific use cases.

  • react-easy-crop:

    react-easy-crop allows for some customization, focusing on ease of use rather than extensive options, making it ideal for projects that prioritize a quick setup over deep customization.

Performance

  • react-image-crop:

    react-image-crop is generally performant but may require optimization for very large images or complex cropping scenarios to maintain a smooth user experience.

  • cropperjs:

    CropperJS is optimized for performance, allowing for smooth interactions even with large images, making it suitable for applications that handle high-resolution images.

  • ngx-image-cropper:

    ngx-image-cropper performs well within Angular applications, but performance may vary based on the complexity of the Angular app and the size of the images being processed.

  • react-easy-crop:

    react-easy-crop is lightweight and designed for performance, ensuring quick response times and smooth interactions, especially on mobile devices.

Community and Support

  • react-image-crop:

    react-image-crop benefits from a strong React community, with comprehensive documentation and examples available, making it easier for developers to utilize its features.

  • cropperjs:

    CropperJS has a large community and extensive documentation, providing ample resources for developers to troubleshoot issues and find examples of implementation.

  • ngx-image-cropper:

    ngx-image-cropper has a supportive community within the Angular ecosystem, with good documentation that helps Angular developers implement the library effectively.

  • react-easy-crop:

    react-easy-crop has a growing community and is well-documented, making it easier for React developers to find help and resources for implementation.

How to Choose: react-image-crop vs cropperjs vs ngx-image-cropper vs react-easy-crop

  • react-image-crop:

    Choose react-image-crop if you need a more feature-rich React component that offers advanced cropping functionalities, including aspect ratio control and image preview. It is ideal for applications that require more complex cropping options and want to leverage React's component-based architecture.

  • cropperjs:

    Choose CropperJS if you need a standalone, flexible, and highly customizable image cropping solution that can be integrated into any web project without being tied to a specific framework. It provides a rich set of features and is suitable for developers who want full control over the cropping functionality.

  • ngx-image-cropper:

    Select ngx-image-cropper if you are developing an Angular application and want a seamless integration with Angular's reactive forms. It offers a straightforward API and is designed to work well within Angular's ecosystem, making it ideal for Angular developers looking for a reliable image cropping solution.

  • react-easy-crop:

    Opt for react-easy-crop if you are building a React application and prefer a simple, easy-to-use cropping library that supports touch gestures and responsive design. It is lightweight and focuses on providing a smooth user experience, making it suitable for projects where ease of use is a priority.

README for react-image-crop

React Image Crop

An image cropping tool for React with no dependencies.

React Image Crop on NPM

CodeSandbox Demo

ReactCrop GIF

Table of Contents

  1. Features
  2. Installation
  3. Usage
  4. Example
  5. CDN
  6. Props
  7. FAQ
    1. How can I generate a crop preview in the browser?
    2. How to correct image EXIF orientation/rotation?
    3. How to filter, rotate and annotate?
    4. How can I center the crop?
  8. Contributing / Developing

Features

  • Responsive (you can use pixels or percentages).
  • Touch enabled.
  • Free-form or fixed aspect crops.
  • Fully keyboard accessible (a11y).
  • No dependencies/small footprint (<5KB gzip).
  • Min/max crop size.
  • Crop anything, not just images.

If React Crop doesn't cover your requirements then take a look at Pintura (our sponsor). It features cropping, rotating, filtering, annotation, and lots more.

Learn more about Pintura here

Installation

npm i react-image-crop --save
yarn add react-image-crop
pnpm add react-image-crop

This library works with all modern browsers. It does not work with IE.

Usage

Include the main js module:

import ReactCrop from 'react-image-crop'

Include either dist/ReactCrop.css or ReactCrop.scss.

import 'react-image-crop/dist/ReactCrop.css'
// or scss:
import 'react-image-crop/src/ReactCrop.scss'

Example

import ReactCrop, { type Crop } from 'react-image-crop'

function CropDemo({ src }) {
  const [crop, setCrop] = useState<Crop>()
  return (
    <ReactCrop crop={crop} onChange={c => setCrop(c)}>
      <img src={src} />
    </ReactCrop>
  )
}

See the sandbox demo for a more complete example.

CDN

<link href="https://unpkg.com/react-image-crop/dist/ReactCrop.css" rel="stylesheet" />
<script src="https://unpkg.com/react-image-crop/dist/index.umd.cjs"></script>

Note when importing the script globally using a <script> tag access the component with ReactCrop.Component.

Props

onChange: (crop: PixelCrop, percentCrop: PercentCrop) => void

A callback which happens for every change of the crop (i.e. many times as you are dragging/resizing). Passes the current crop state object.

Note you must implement this callback and update your crop state, otherwise nothing will change!

<ReactCrop crop={crop} onChange={(crop, percentCrop) => setCrop(crop)} />

crop and percentCrop are interchangeable. crop uses pixels and percentCrop uses percentages to position and size itself. Percent crops are resistant to image/media resizing.

crop?: Crop

Starting with no crop:

const [crop, setCrop] = useState<Crop>()

<ReactCrop crop={crop} onChange={c => setCrop(c)}>
  <img src={src} />
</ReactCrop>

Starting with a preselected crop:

const [crop, setCrop] = useState<Crop>({
  unit: '%', // Can be 'px' or '%'
  x: 25,
  y: 25,
  width: 50,
  height: 50
})

<ReactCrop crop={crop} onChange={c => setCrop(c)}>
  <img src={src} />
</ReactCrop>

⚠️ You must ensure the crop is in bounds and correct to the aspect ratio if manually setting. Aspect ratios can be tricky when using %. You can make use of centerCrop and makeAspectCrop helpers. See How can I center the crop? or the CodeSanbox Demo for examples.

aspect?: number

The aspect ratio of the crop, e.g. 1 for a square or 16 / 9 for landscape. Omit/pass undefined for a free-form crop.

minWidth?: number

A minimum crop width, in pixels.

minHeight?: number

A minimum crop height, in pixels.

maxWidth?: number

A maximum crop width, in pixels.

maxHeight?: number

A maximum crop height, in pixels.

keepSelection?: boolean

If true is passed then selection can't be disabled if the user clicks outside the selection area.

disabled?: boolean

If true then the user cannot resize or draw a new crop. A class of ReactCrop--disabled is also added to the container for user styling.

locked?: boolean

If true then the user cannot create or resize a crop, but can still drag the existing crop around. A class of ReactCrop--locked is also added to the container for user styling.

className?: string

A string of classes to add to the main ReactCrop element.

style?: React.CSSProperties

Inline styles object to be passed to the image wrapper element.

onComplete?: (crop: PixelCrop, percentCrop: PercentCrop) => void

A callback which happens after a resize, drag, or nudge. Passes the current crop state object.

percentCrop is the crop as a percentage. A typical use case for it would be to save it so that the user's crop can be restored regardless of the size of the image (for example saving it on desktop, and then using it on a mobile where the image is smaller).

onDragStart?: (e: PointerEvent) => void

A callback which happens when a user starts dragging or resizing. It is convenient to manipulate elements outside this component.

onDragEnd?: (e: PointerEvent) => void

A callback which happens when a user releases the cursor or touch after dragging or resizing.

renderSelectionAddon?: (state: ReactCropState) => React.ReactNode

Render a custom element inside the crop selection.

ruleOfThirds?: boolean

Show rule of thirds lines in the cropped area. Defaults to false.

circularCrop?: boolean

Show the crop area as a circle. If your aspect is not 1 (a square) then the circle will be warped into an oval shape. Defaults to false.

FAQ

How can I generate a crop preview in the browser?

This isn't part of the library but there is an example over here CodeSandbox Demo.

How to correct image EXIF orientation/rotation?

You might find that some images are rotated incorrectly. Unfortunately this is a browser wide issue not related to this library. You need to fix your image before passing it in.

You can use the following library to load images, which will correct the rotation for you: https://github.com/blueimp/JavaScript-Load-Image/

You can read an issue on this subject here: https://github.com/dominictobias/react-image-crop/issues/181

If you're looking for a complete out of the box image editor which already handles EXIF rotation then consider using Pintura.

How to filter, rotate and annotate?

This library is deliberately lightweight and minimal for you to build features on top of. If you wish to perform more advanced image editing out of the box then consider using Pintura.

Pintura Demo

How can I center the crop?

The easiest way is to use the percentage unit:

crop: {
  unit: '%',
  width: 50,
  height: 50,
  x: 25,
  y: 25
}

Centering an aspect ratio crop is trickier especially when dealing with %. However two helper functions are provided:

  1. Listen to the load event of your media to get its size:
<ReactCrop crop={crop} aspect={16 / 9}>
  <img src={src} onLoad={onImageLoad} />
</ReactCrop>
  1. Use makeAspectCrop to create your desired aspect and then centerCrop to center it:
function onImageLoad(e) {
  const { naturalWidth: width, naturalHeight: height } = e.currentTarget

  const crop = centerCrop(
    makeAspectCrop(
      {
        // You don't need to pass a complete crop into
        // makeAspectCrop or centerCrop.
        unit: '%',
        width: 90,
      },
      16 / 9,
      width,
      height
    ),
    width,
    height
  )

  setCrop(crop)
}

Also remember to set your crop using the percentCrop on changes:

const onCropChange = (crop, percentCrop) => setCrop(percentCrop)

And your aspect prop should be set to the same value: <ReactCrop aspect={16 / 9} ... />.

Contributing / Developing

To develop run pnpm install && pnpm dev and open the localhost server in your browser. Update code and it will reload. When you're ready, open a pull request.