Интеллектуальная Обрезка Изображения С Использованием Фокусной Точки

Недавно передо мной стояла задача обрезать около сотни огромных фотографий из фотобанка в несколько десятков разных размеров.

Эти готовые изображения затем будут использоваться клиентами CMS для разработки своих веб-сайтов.

Прикинув, сколько времени займет этот процесс в Фотошопе, мне стало грустно — встречать следующий Новый год обрезкой фотографий не входит в мои планы.



Идея

Мозг программиста не может существовать без программирования.

Любая задача, требующая повторения рутинных операций более 3-х раз, сразу начинает вызывать в голове вопросы: «Как это можно автоматизироватьЭ» и проекты алгоритмов.

Так произошло и на этот раз.

Немного подумав, я пришел к выводу, что необходимо ввести понятие точки фокуса и учитывать это при обрезке.

Если пропорции нового изображения близки к исходным, например, мы вырезали из квадрата прямоугольник с соотношением сторон 3:4, то все в порядке – новое изображение даже не потеряет своей композиции.

Если размер нового изображения будет существенно отличаться, например, это узкая полоска для слайдера, то, по крайней мере, мы сохраним наиболее значимую информацию.

Не забывайте, мы все еще говорим об автоматической обрезке.

Вот иллюстрация, демонстрирующая механизм.



Интеллектуальная обрезка изображения с использованием фокусной точки

Так, координационный центр — это точка в центре области, содержащая самую важную часть изображения, и которая в любом случае должна остаться при обрезке.

При обычной фотографии объектив при съемке будет фокусироваться в этой области; особенно это видно, если съемка велась с малой глубиной резкости.

Отсюда, собственно, и название понятия.

Я решил проверить свои выводы и посмотреть, делал ли кто-нибудь уже что-то подобное.

Нашел библиотеку HTML/CSS для адаптивного обрезки изображений.

github.com/adamdbradley/focal-point .

Здесь также используется понятие «точка фокусировки», а значит моя идея верна! Но мне нужна была готовая утилита, которая могла бы генерировать физические образы.

Не смог найти такого.



Выполнение

Тогда я взялся за Node.js, который хоть и не мой обычный рабочий инструмент, но который мне очень нравится использовать для автоматизации и небольших утилит. Алгоритм обрезки нового изображения следующий:
  1. Рассчитаем пропорции итогового изображения:

    k=Wr/Hr

    , где Wr и Hr — ширина и высота будущего изображения
  2. Определите максимальный прямоугольник, который поместится в исходное изображение:

    if Wr >= Hr



    then Wm = Wi, Hm = Wi/k



    else Hm = Hi, Wm = Hm*k

    , где Wi, Hi — размеры оригинала, а Wm, Hm — размеры максимального прямоугольника.

  3. Рассчитаем новые координаты точки фокуса:

    fx2 = fx*Wm/Wi

    ,

    fy2 = fy*Hm/Hi

    , fx, fx — координаты фокуса на исходном изображении
  4. Делаем собственно обрезку, сдвигая прямоугольник на разницу между старой и новой координатами точки фокусировки:

    crop(Wm, Hm, (fx-fx2), (fy-fy2))

  5. Уменьшите результат до нужного размера:

    resize(Wr, Hr)

Для обработки изображений я взял модуль GraphicsMagick для узла , поскольку обещал беспроблемную работу с графическими библиотеками под Windows. И она почти не лгала.

Мне так и не удалось запустить с ним ImageMagick (да и старый модуль imagemagick-node работал без проблем), но альтернатива в виде GraphicsMagick заработала сразу и без шаманства.

Теоретически ImageMagick должен работать и на другой платформе; жесткой привязки к библиотеке в модуле gm нет. В финальную утилиту я добавил небольшую оптимизацию для веба: из конечного изображения вырезается вся информация EXIF, ICM и т.д. и полученное маленькое изображение обрабатывается через фильтр повышения резкости.

При уменьшении размера с 3000x4000px до 200x300px это действительно необходимо.

Для удобства использования исходные данные получены в виде 2-х файлов:

  1. formats.json — файл, в котором перечислены форматы, которые нужно обрезать.

  2. images.json — это файл, в котором перечислены изображения и установлены точки фокусировки.

    Здесь вы можете указать, куда и в каком качестве сохранять снимки.

Подробную информацию о форматах файлов, установке и дополнительных возможностях можно найти в репозитории на GitHub. github.com/fetis/fcrop .

Там же вы можете найти демо-версию примеров.

И напоследок пример работы утилиты Ссылка на оригинальное изображение 5,4 МБ

Интеллектуальная обрезка изображения с использованием фокусной точки

200x135

Интеллектуальная обрезка изображения с использованием фокусной точки

500x180

Интеллектуальная обрезка изображения с использованием фокусной точки

900x172 Теги: #node.js #Обработка изображений #обрезка #graphicsmagick #автоматизация процедур #node.js #Обработка изображений

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.