Коротко о главном: главный обработчик изображений из командной строки, равно как и в пакетном режиме, у нас по прежнему пакет ImageMagick. КДПВ справа взята поиском по его названию в «картинках Google», помимо демонстрации некоторых возможностей там и пингвин присутствует.
Кроме того, нам понадобятся минимальные знания оболочки GNU Bash и замечательная утилита для работы с данными EXIF (Exchangeable Image File Format — стандарт, позволяющий добавлять к изображениям метаданные, в первую очередь, когда и чем снято) — exiftool.
С одной стороны, расписывать все возможности ImageMagick и ExifTool в подробностях — никакого терпения не хватит. С другой — у меня есть парочка примеров, собственноручно наскриптованных, но не описанных… Поэтому в данном посте я просто разберу эти примеры, а если нужно что-то дополнительно, прошу в комментарии.
На свежем Linux Mint потребуется установить пакеты «libimage-exiftool-perl» и «imagemagick». Версии, наличествующие в репозитории, не самые последние, но лично меня вполне устраивают.
Первый пример можно видеть в посте «exiftool — раскидываем raw-файлы по дате». Там два однострочника, которые особого комментария и не требуют. Для порядка поясню, что:
-
-r
, как и во многих других утилитах, указывает реверсивно обрабатывать вложенные каталоги; -
-FileName<
(да, вот такой оригинальный синтаксис) определяет шаблон имени файла; -
-d
— задает формат даты; - а
-ext CR2 .
велит собирать все файлы с таким расширением, начиная с текущего каталога.
Также стоит заметить, что указанный пример именно перемещает файлы. Чтобы их скопировать, требуется некоторое
шаманство с ключиком -o
. Вообще, exiftool написан на Perl, и это чувствуется…
Второй пример поинтересней. Я его до сих пор не описывал, а вот на GitHub выложил: vkify — утилита для подгонки фото
под заданный размер и наложения надписи о метаданных. Как можно догадаться, в первую очередь предполагается
выкладывание фоточек в б-гомерзкий всеми любимый ВКонтактик, но это совершенно необязательно.
На строках до 40-й останавливаться не буду, поскольку это Bash и только Bash, не имеющий прямого отношения к фото, равно как и на строках, начиная с 74-й. А вот между ними расположен интересующий нас скрипт.
Из строк 46–55 мы узнаём, что exiftool имеет ключик -p
, позволяющий просто вывести (print) строку, заполненную
по шаблону данными EXIF:
А еще нам становится известно, что информация об объективе и о камере имеется не всегда. Обычно это характерно для фото с мобильных.
${FocalLength#}
вместо ${FocalLength}
, используется, чтобы получить «50
» вместо «50.0 mm
» — в общем случае суффикс «#
»
нужен, чтобы получить числовое значение заданного тега вместо его описания.
Таким образом мы получили две строки: одна — с датой/временем, а другая — с техническими характеристиками съемки. Я их разделил, чтобы выводить разным шрифтом — дата/время крупнее.
Далее. Строки 61–62 формируют черный прямоугольник с датой и временем, а 63–64 — с прочей инфой соответственно. Они однотипны, рассмотрим одну пару:
convert
создает новый файл, а mogrify
изменяет уже существующий (в данном случае всего лишь добавляет рамку).
Переменная $TIME_FONT
должна развернуться в параметры шрифта — по умолчанию там будет '-pointsize 16'
, в настройках, которые
я сам использую — '-pointsize 16 -font ConsolaMono'
. Думаю, способ задания шрифта понятен.
Ключи -background
, -fill
и -bordercolor
задают цвета фона, текста и рамки соотвественно; -border
— толщина рамки; -gravity
—
выравнивание (east
означает «вправо», для текста — по правому краю, для даты/времени это неважно, а вот другая информация
у нас многострочная).
Выражение label:"$time"
стоит на месте имени входного файла. Ну, собственно, это входные данные для преобразования и есть.
Строки 65–66 формируют надпись окончательно:
Ключ -append
склеивает две картинки в одну с учетом выравнивания и заливает недостающие области цветом фона.
Выражение «-alpha set -channel A -evaluate set 30%
» не очень-то осмысленно разбивается по отдельным ключам, а в совокупности
означает: добавить альфа-канал и установить значения его пикселей в 30%.
Может сложиться впечатление, что ImageMagick тоже написан на Perl’е, или еще на какой разновидности BrainFuck’а. Но это не так, просто он очень универсален и потому сложен.
И венчает обработку строка 68, которая сама по себе — целый скрипт:
Внутри скобок, как можно догадаться, мы банально изменяем размер исходного файла (-resize
). Затем накладываем (-composite
)
подготовленный штамп в «юго-восточный» угол (-gravity
) с отступами 20px от обеих сторон (-geometry
). Далее вырезаем из получившегося
данные EXIF (-strip
) и задаем качество (-quality
) конечного файла в 80 условных единиц (читай — процентов, поскольку задается
оно в диапазоне 1–100).
В итоге мы получаем возможность в пакетном режиме получать такое:
Тонирование и кадрирование я до того сделал в Darktable, см. предыдущий пост. Почему-то ImageMagick на моих TIFF, полученных из Darktable, выдает кучу предупреждений типа «Unknown field…», но на результат они не влияют.
Как ImageMagick, так и ExifTool — инструменты довольно навороченные. В их параметрах можно комбинировать множество
различных ключей и выражений. Вышеиспользованные получены вдумчивым курением официальной документации
и многочисленными бесчеловечными экспериментами. Пытайтесь повторить это дома.
Что касается аналогов, можно присмотреться к Exiv2 и jhead для работы с EXIF, хотя мне они как-то не глянулись. А для ImageMagick есть его клон и форк — GraphicsMagick, который во многом превосходит оригинал.