ImageCropper

ImageCropper — кадрирование фото на Ark ImageCropper. Размер итогового файла задаёт потребитель (size, в пикселях), а пользователь только подгоняет фото под неподвижную рамку: двигает его мышью или пальцем и зумит ползунком, колесом или щипком. Вытащить из-под рамки край фото нельзя — пустых полей в файле не бывает.

Исходник — File, обычно из FileUpload: кроппер ставится на место дроп-зоны или в окно, где и как — решает потребитель. ImageCropper.Viewport — область с рамкой, ImageCropper.Zoom — ползунок под ней.

Результат забирают в момент сохранения: ref.current.getCroppedFile() вырезает то, что в рамке, и приводит к size — выбранный кусок ужимается или растягивается до заданных пикселей. Формат файла — как у исходника (JPEG, PNG, WebP; остальные становятся PNG), другой задаётся аргументом { type, quality }. Пока фото не прочитано, метод возвращает null.

Перетащите изображение или нажмите для выбора

Анатомия

ImageCropper.Root
ImageCropper.Viewport
Image (фото под рамкой)
Selection (рамка)
ImageCropper.Zoom
Slider

Примеры

Готово и редактирование

Кроп как шаг: по «Готово» кроппер уступает место готовой картинке, «Редактировать» возвращает его обратно. Кроппер при этом не размонтируется, а прячется через style — поэтому возвращается с тем же зумом и положением фото, а не с начала.

Перетащите изображение или нажмите для выбора

В окне

Аватарка: загрузчик показывает уже кадрированный файл, а выбранное фото уходит в FloatingPanel и попадает в набор только после «Сохранить». Для этого acceptedFiles ведётся контролируемо, а onFileAccept вместо записи в набор открывает окно. shape="circle" — круглая маска: сам файл остаётся квадратным.

API

PropTypeDefault
file*

Исходное фото — обычно файл из FileUpload. Новый файл начинает кроп заново: зум и положение сбрасываются

File-
size*

Размер итогового файла в пикселях. Из него же берутся пропорции рамки: пользователь её не меняет, а двигает и зумит фото под ней

ImageCropperSize-
shape

Форма рамки. circle — только маска для круглых аватарок: файл получается квадратным, поэтому size должен быть квадратом

"rectangle" | "circle""rectangle"
maxZoom

Предел увеличения. На зуме 1 фото вписано в рамку вплотную — меньше не бывает

number3
ref

Ручка кроппера: ref.current.getCroppedFile() отдаёт итоговый файл. Зовётся в момент сохранения — по кнопке окна или при отправке формы

Ref<ImageCropperHandle>-
children*

Части кроппера: Viewport и Zoom

ReactNode-
classNamestring-
styleCSSProperties-

ImageCropper.Viewport

Область кадрирования. Рамка — наибольшая из помещающихся в область с полями, поэтому высоту области (по умолчанию 280px) задают className / style. Пока фото читается, область пуста; файл, который не открылся как изображение, заменяется сообщением.

PropTypeDefault
className

Класс области: ей задают свою высоту (по умолчанию 280px) и скругление

string-
styleCSSProperties-

ImageCropper.Zoom

Ползунок зума от 1 (фото вписано в рамку вплотную) до maxZoom. Необязателен: колесо и щипок работают и без него, но с клавиатуры зум доступен только здесь.

PropTypeDefault
classNamestring-
styleCSSProperties-