---
sidebar_position: 1
slug: /image-editor
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import UppyCdnExample from '/src/components/UppyCdnExample';
# Image editor
Image editor. Designed to be used with the Dashboard UI.

## When should I use this?
When you want to allow users to crop, rotate, zoom and flip images that are
added to Uppy.
## Install
```shell
npm install @uppy/core @uppy/dashboard @uppy/image-editor
```
```shell
yarn add @uppy/core @uppy/dashboard @uppy/image-editor
```
{`
import { Uppy, Dashboard, ImageEditor } from "{{UPPY_JS_URL}}"
const uppy = new Uppy()
uppy.use(Dashboard, { target: '#uppy', inline: true })
uppy.use(ImageEditor)
`}
## Use
```js {3,7,11} showLineNumbers
import Uppy from '@uppy/core';
import Dashboard from '@uppy/dashboard';
import ImageEditor from '@uppy/image-editor';
import '@uppy/core/dist/style.min.css';
import '@uppy/dashboard/dist/style.min.css';
import '@uppy/image-editor/dist/style.min.css';
new Uppy()
.use(Dashboard, { inline: true, target: '#dashboard' })
.use(ImageEditor);
```
## API
### Options
:::info
If you automatically want to open the image editor when an image is added, see
the [`autoOpen`](/docs/dashboard#autoopen) Dashboard option.
:::
#### `id`
A unique identifier for this plugin (`string`, default: `'ImageEditor'`).
#### `quality`
Quality Of the resulting blob that will be saved in Uppy after editing/cropping
(`number`, default: `0.8`).
#### `cropperOptions`
Image Editor is using the excellent
[Cropper.js](https://fengyuanchen.github.io/cropperjs/). `cropperOptions` will
be directly passed to `Cropper` and thus can expect the same values as
documented in their
[README](https://github.com/fengyuanchen/cropperjs/blob/HEAD/README.md#options),
with the addition of `croppedCanvasOptions`, which will be passed to
[`getCroppedCanvas`](https://github.com/fengyuanchen/cropperjs/blob/HEAD/README.md#getcroppedcanvasoptions).
#### `actions`
Show action buttons (`Object` or `boolean`).
If you you’d like to hide all actions, pass `false` to it. By default all the
actions are visible. Or enable/disable them individually:
```js
{
revert: true,
rotate: true,
granularRotate: true,
flip: true,
zoomIn: true,
zoomOut: true,
cropSquare: true,
cropWidescreen: true,
cropWidescreenVertical: true,
}
```
#### `locale: {}`
```js
export default {
strings: {
revert: 'Revert',
rotate: 'Rotate',
zoomIn: 'Zoom in',
zoomOut: 'Zoom out',
flipHorizontal: 'Flip horizontal',
aspectRatioSquare: 'Crop square',
aspectRatioLandscape: 'Crop landscape (16:9)',
aspectRatioPortrait: 'Crop portrait (9:16)',
},
};
```
### Events
:::info
You can use [`on`](/docs/uppy#onevent-action) and
[`once`](/docs/uppy#onceevent-action) to listen to these events.
:::
#### `file-editor:start`
Emitted when `selectFile(file)` is called.
```js
uppy.on('file-editor:start', (file) => {
console.log(file);
});
```
#### `file-editor:complete`
Emitted after `save(blob)` is called.
```js
uppy.on('file-editor:complete', (updatedFile) => {
console.log(updatedFile);
});
```
#### `file-editor:cancel`
Emitted when `uninstall` is called or when the current image editing changes are
discarded.
```js
uppy.on('file-editor:cancel', (file) => {
console.log(file);
});
```