MCPcopy Index your code
hub / github.com/ValentinH/react-easy-crop

github.com/ValentinH/react-easy-crop @v6.1.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v6.1.0 ↗ · + Follow
57 symbols 125 edges 25 files 2 documented · 4% 17 cross-repo links updated 1d agov6.2.2 · 2026-07-08★ 2,7485 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

react-easy-crop

A React component to crop images/videos with easy interactions

[![version][version-badge]][package] All Contributors [![Build Status][build-badge]][build-page] [![Test Status][test-badge]][test-action] [![MIT License][license-badge]][license] [![PRs Welcome][prs-badge]][prs] Auto Release

Demo GIF

react-easy-crop npminsights

Demo

Check out the hosted examples:

Features

  • Supports drag, zoom and rotate interactions
  • Provides crop dimensions as pixels and percentages
  • Supports any images format (JPEG, PNG, even GIF) as url or base 64 string
  • Supports any videos format supported in HTML5
  • Mobile friendly

If react-easy-crop doesn't cover your needs we recommend taking a look at Pintura

Pintura features cropping, rotating, flipping, filtering, annotating, and lots of additional functionality to cover all your image and video editing needs on both mobile and desktop devices.

Learn more about Pintura

Video tutorials from the community

Installation

pnpm add react-easy-crop

or

npm install react-easy-crop --save

Basic usage

The Cropper is styled with position: absolute to take the full space of its parent. Thus, you need to wrap it with an element that uses position: relative or the Cropper will fill the whole page.

import { useState, useCallback } from 'react'
import Cropper from 'react-easy-crop'

const Demo = () => {
  const [crop, setCrop] = useState({ x: 0, y: 0 })
  const [zoom, setZoom] = useState(1)

  const onCropComplete = (croppedArea, croppedAreaPixels) => {
    console.log(croppedArea, croppedAreaPixels)
  }

  return (
    <Cropper
      image={yourImage}
      crop={crop}
      zoom={zoom}
      aspect={4 / 3}
      onCropChange={setCrop}
      onCropComplete={onCropComplete}
      onZoomChange={setZoom}
    />
  )
}

Styles

This component requires some styles to be available in the document. By default, you don't need to do anything, the component will automatically inject the required styles in the document head. If you want to disable this behaviour and manually inject the CSS, you can set the disableAutomaticStylesInjection prop to true and use the file available in the package: react-easy-crop/react-easy-crop.css.

Known issues

The cropper size isn't correct when displayed in a modal

If you are using the Cropper inside a modal, you should ensure that there is no opening animation that is changing the modal dimensions (scaling effect). Fading or sliding animations are fine. See #428, #409, #267 or #400 for more details.

Props

Prop Type Required Description
image string The image to be cropped. image or video is required.
video string or Array<{ src: string; type?: string }> The video to be cropped. image or video is required.
crop { x: number, y: number } Position of the media. { x: 0, y: 0 } will center the media under the cropper.
zoom number Zoom of the media between minZoom and maxZoom. Defaults to 1.
rotation number (in degrees) Rotation of the media. Defaults to 0.
aspect number Aspect of the cropper. The value is the ratio between its width and its height. The default value is 4/3
minZoom number Minimum zoom of the media. Defaults to 1.
maxZoom number Maximum zoom of the media. Defaults to 3.
zoomWithScroll boolean Enable zoom by scrolling. Defaults to true
cropShape 'rect' | 'round' Shape of the crop area. Defaults to 'rect'.
cropSize { width: number, height: number } Size of the crop area (in pixels). If you don't provide it, it will be computed automatically using the aspect prop and the media size. You should probably not use this option and should rely on aspect instead. See https://github.com/ValentinH/react-easy-crop/issues/186.
showGrid boolean Whether to show or not the grid (third-lines). Defaults to true.
roundCropAreaPixels boolean Whether to round the crop area dimensions to integer pixels. Defaults to false.
zoomSpeed number Multiplies the value by which the zoom changes. Defaults to 1.
objectFit 'contain', 'cover', 'horizontal-cover' or 'vertical-cover' Specifies how the image is shown in the cropper. contain: the image will be adjusted to be fully visible, horizontal-cover: the image will horizontally fill the cropper, vertical-cover: the image will vertically fill the cropper, cover: we automatically pick between horizontal-cover or

Extension points exported contracts — how you extend this code

Core symbols most depended-on inside this repo

Shape

Function 42
Method 10
Class 4
Interface 1

Languages

TypeScript100%

Modules by API surface

src/helpers.ts17 symbols
src/Cropper.tsx10 symbols
docs/src/components/RestoreCropExample.tsx5 symbols
scripts/copy-build-files.js4 symbols
examples/src/index.tsx4 symbols
docs/src/components/CropperExample.tsx4 symbols
examples/src/iframe.tsx3 symbols
cypress/integration/basic_spec.js3 symbols
docs/src/components/cropImage.ts2 symbols
docs/src/components/ExampleFrame.tsx2 symbols
docs/src/pages/index.tsx1 symbols
cypress/integration/iframe_spec.js1 symbols

For agents

$ claude mcp add react-easy-crop \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page