Делаем веб-приложение с Instagram-подобными фильтрами

Instagram-like Filters

В этом туториале мы собираемся сделать простое веб-приложение, которое позволяет перетащить фотографию с вашего компьютера в окно браузера и применить к ней Instagram-подобные фильтры. Для этого мы будем использовать следующие JavaScript библиотеки и плагины:

  • Caman.js — это мощная библиотека для работы с canvas, которая позволяет применять различные эффекты и фильтры на изображении. Библиотека поставляется с восемью предустановленными фильтрами, которые мы будем использовать в этом примере (вы можете создать больше, если хотите);
  • Filereader.js — это облегченный врапер для событий перетаскивания в HTML5 (drag/drop), который значительно упрощает работу с этими событиями. Он также добавляет метод jQuery, поэтому вы можете привязывать события к определенному элементу;
  • JQuery Mousewheel — я использую этот плагин для прокрутки блока с фильтрами;
  • Кроме того, мы используем последнюю версию jQuery на момент написания.

Также большое спасибо Jenn и Tony Bot за их фотографию.

HTML-код

Первый шаг — написание HTML примера:

index.html

В дополнение к библиотекам, упомянутым вначале, мы также подключаем файл script.js, в котором содержится код, который мы будем писать ниже. В хедере подключаем шрифт Yanone Kaffeesatz из Google Web Fonts.

Приложение Instagram Filter

JavaScript / jQuery

Чтобы приложение работало, нам нужно будет сделать следующее:

  1. Принять изображение при перетаскивании (drag and drop);
  2. Создать новый элемент canvas (оригинальный) с максимальным размером 500×500 пикселей (опционально) и сохранить его в памяти;
  3. Прослушивать клики по фильтрам. Когда выбран один из фильтров:
    • Создать клон оригинального canvas;
    • Удалить все элементы canvas, находящиеся на странице;
    • Добавить клон в блок #photo;
    • Если выбранный фильтр отличается от «Текущего», вызвать библиотеку Caman.js. В противном случае ничего не делать;
    • Отметить выбранный фильтр классом active.
  4. Переключить фильтр на «Текущий».

Теперь, когда мы знаем, что нужно сделать, давайте начнем кодить!

assets/js/script.js

Этот пример работает во всех браузерах, поддерживающих перетаскивание (drag/drop) файлов. Некоторые из фильтров являются вычислительно затратными, поэтому возможны небольшие запаздываниями при выводе результата в браузере. Я ограничил максимальную ширину/высоту изображения размером 500 пикселей, чтобы немного ускорить работу, но вы можете изменить эти значения по своему усмотрению.

Использование атрибута загрузки HTML5

Атрибут загрузки HTML5 указывает браузеру, что вместо отображения ссылки он должен загрузить его как файл. Более того, значение этого атрибута — это имя файла, которое будет указано при сохранении. На данный момент 78% устройств поддерживают этот атрибут. Чтобы использовать его, мы должны создать ссылку для загрузки изображения и добавить к нему атрибут:

index.html

Атрибут href будет заменен на DataURL изображения, которое легко получить из canvas. Я поместил ссылку в div #photo, чтобы она шла сразу после изображения.

Затем стилизуем нашу ссылку:

styles.css

Оны должена выглядеть так:

download-button

И последнее, что нам нужно сделать, включить две функции в основной JavaScript файл:

Эти функции показывают и скрывают кнопку загрузки соответственно. Функция showDownload срабатывает при клике. Когда это происходит, она преобразует элемент canvas в строку dataURL и устанавливает атрибут href. Поскольку у нас уже есть атрибут download, это загрузит содержимое canvas как photo.png. Я вызываю эти функции как callback функции в библиотеке Caman.js:

script.js

Код показывает кнопку только тогда, когда фильтр отличается от «Текущего».

С этим наше приложение готово! Я надеюсь, что вы найдете его полезным.

Не совсем точный перевод статей на:

  1. tutorialzine.com
  2. tutorialzine.com