An open source project by cc:Monet, an AI-powered bookkeeping platform that helps businesses automate their financial processes.
A React component that allows users to draw multiple crop regions on an image. Originally developed to handle document processing and receipt scanning features at cc:Monet, this component has been improved and open-sourced for broader use.
It was built and improved based on react-multi-crops.
It has latest support and more complete functionalities with improved performance
npm install react-multi-crop-image
or
yarn add react-multi-crop-image
// src/App.tsx
import React, { useState } from 'react';
import { MultiCrops } from 'react-multi-crop-image';
const App: React.FC = () => {
const [croppedImages, setCroppedImages] = useState<string[]>([]);
return (
<div>
<MultiCrops imageUrl={"YOUR_IMAGE_URL"} setCroppedImages={setCroppedImages} crossOrigin="anonymous" />
<div>
{croppedImages.map((image, index) => (
<img key={index} src={image} alt={`Cropped ${index}`} />
))}
</div>
</div>
);
};
export default App;
The MultiCrops
component allows users to create, manage, and export multiple cropped sections from a given image. It's highly customizable, enabling you to style the cropping areas, number icons, and delete icons to fit your application's design.
Prop | Type | Required | Description |
---|---|---|---|
imageUrl |
string |
Yes | The URL of the image to be displayed and cropped. |
setCroppedImages |
React.Dispatch<React.SetStateAction<string[]>> |
Yes | A state setter function to store the data URLs of the cropped images. |
crossOrigin |
"" | "anonymous" | "use-credentials" |
Yes | Specifies the cross-origin behavior of the image. Use "" for no cross-origin, "anonymous" for CORS-enabled images without credentials, or "use-credentials" for CORS with credentials. |
cropStyle |
React.CSSProperties |
No | Custom styles to apply to each cropping area. Overrides the default crop styles. |
activeCropStyle |
React.CSSProperties |
No | Custom styles to apply to the currently selected/active cropping area. |
numberIconStyle |
React.CSSProperties |
No | Custom styles for the number icons displayed within each cropping area. |
deleteIconStyle |
React.CSSProperties |
No | Custom styles for the delete icons used to remove cropping areas. |
deleteIconContainerStyle |
React.CSSProperties |
No | Custom styles for the container wrapping the delete icons. |
interface Coordinate {
x: number;
y: number;
width: number;
height: number;
id: string;
}
Defines the cross-origin settings for the image.
type CrossOrigin = "" | "anonymous" | "use-credentials";
Represents a point with x
and y
coordinates.
interface Point {
x: number;
y: number;
}
MIT
- Improve performance
- Improve cropped image size
- Add scrollable cropping
- Improve performance
- expose coordinates to external coordinates handling
- Add initial coordinates
- Add
onCoordinatesChange
callback
- Fixed the issue where the crop area was not being properly handled when the container was scrollable
- allow scrollable container
- change crosshair style
- Higher resolution image
- Readme with demo
- lodash to improve performance
- new active and inactive management
- new active and inactive crop styles
- Better Readme
- Full code refactoring
- Smoother crop area resizing
- Remove unnecessary styles
- Fix delete icon
-
cropStyle
,numberIconStyle
,deleteIconStyle
,deleteIconContainerStyle
props
-
onCropComplete
callback with base64 image data - Better TypeScript type exports
- Additional prop validation
- Touch device support
- Rotation controls
- Aspect ratio constraints
- Custom styling options
- Zoom functionality
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.