Пишем простой редактор аватарок на JavaScript
В этой статье мы расскажем, как написать простой редактор для аватарок, чтобы облегчить жизнь пользователям.
vlada_maestro / shutterstock
Если на сайте можно загрузить аватарку, то хорошо бы добавить минимальный редактор, который позволит обрезать изображение. Реализовать это относительно просто, и все стороны остаются в выигрыше: пользователю удобнее делать всё на сайте, не уходя с него.
Как работает редактор
Редактор берёт уже сохранённую фотографию и выводит её на страницу. Далее пользователь выбирает нужный ему фрагмент с помощью мыши или вводит значения в форме.
После сохранения сайт отправляет запрос PHP-скрипту, который обрезает фотографию и помещает её в отдельный файл. В итоге пользователь видит ссылку с результатом работы редактора.
Здесь мы покажем только важные фрагменты приложения, а полный исходный код вы найдёте в репозитории на GitHub.
Вёрстка формы
Для начала нужно сверстать саму страницу в HTML:
Сразу же добавляем стили:
Получается достаточно минималистичная форма:
Изображение выводится с помощью тега img, а поверх него находится элемент canvas. На данном этапе позиция холста не указана — она прописывается скриптом и зависит от позиции изображения.
Дальше берём какое-нибудь изображение, чтобы его редактировать. Я воспользовался сайтом thispersondoesnotexist.com, который генерирует фотографию несуществующего человека.
Пишем JS-скрипт
Для начала получим из DOM нужные нам объекты:
Выполним инициализацию — загрузим изображение, наложим на него холст, заполним поля и так далее:
Чтобы проверить, работает ли функция нормально, я уже добавил рамку на холст:
Давайте рассмотрим код, который отвечает за выделение:
Объект selection хранит данные о том, зажата ли кнопка мыши, какие координаты курсора на холсте, разрешение и позиция выделенной области. Функция DrawSelection () отрисовывает рамку:
Остаётся написать код, который двигает эту область:
Функции MouseDown (), MouseMove () и MouseUp () вызываются при действиях мыши над холстом: зажатии кнопки мыши, передвижении курсора и отпускании кнопки соответственно. Как работают CheckSelection () и Update (), можно увидеть в полном коде в репозитории.
Давайте посмотрим, как это работает:
Заключительный этап — пишем функцию для отправки запроса PHP-скрипту, который будет обрезать изображение:
Эта функция вызывается при нажатии на кнопку Save. Если изображение успешно обрезано, то появится ссылка на него — для этого с объекта newImg будет удалён класс a_hidden.
Пишем PHP-скрипт
PHP-скрипт получает разрешение и позицию нового фрагмента, а также разрешение самого холста. Затем он загружает старое изображение, вырезает из него нужный нам фрагмент и сохраняет в файл newphoto.jpg.
В итоге мы получаем новое изображение, на котором будет выделенный фрагмент. Его разрешение зависит от размера оригинала, а не от размера холста.
Вы можете сделать так, чтобы разрешения совпадали, — для этого измените функцию imagecopyresized ():
Как улучшить редактор аватарок
Вы можете добавить возможность менять разрешение выделенной области с помощью мыши — для этого в функции MouseMove () проверим, в какой области находится курсор, когда пользователь двигает мышь. Если курсор рядом с углом рамки, то меняем размер области, в другом случае — позицию.
В полях формы логичнее выводить значения относительно оригинального изображения, а не холста, — это будет работать, но потребует дополнительных вычислений.
Также вы можете придумать что-нибудь самостоятельно, если достаточно хорошо владеете JavaScript, HTML и CSS.