shikhalev.org

Коротко о главном: главный обработчик изображений из командной строки, равно как и в пакетном режиме, у нас по прежнему пакет ImageMagick. КДПВ справа взята поиском по его названию в «картинках Google», помимо демонстрации некоторых возможностей там и пингвин присутствует.

Кроме того, нам понадобятся минимальные знания оболочки GNU Bash и замечательная утилита для работы с данными EXIF (Exchangeable Image File For­mat — стандарт, позволяющий добавлять к изображениям метаданные, в пер­вую очередь, когда и чем снято) — 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:

time=$(exiftool -d "$TIME_FORMAT" -p '${DateTimeOriginal}' "$source")
camera=$(exiftool -p '${Model}' "$source")
lens=$(exiftool -p '${LensID}' "$source")
info=$(exiftool -p '${FocalLength#}mm, ${ShutterSpeed}s, f/${Aperture}, ISO ${ISO}' "$source")
if [ ! -z "$lens" ]; then
  info="$lens\n$info"
fi;
if [ ! -z "$camera" ]; then
  info="$camera\n$info"
fi;

А еще нам становится известно, что информация об объективе и о камере имеется не всегда. Обычно это характерно для фото с мобильных.

${FocalLength#} вместо ${FocalLength}, используется, чтобы получить «50» вместо «50.0 mm» — в общем случае суффикс «#» нужен, чтобы получить числовое значение заданного тега вместо его описания.

Таким образом мы получили две строки: одна — с датой/временем, а другая — с техническими характеристиками съемки. Я их разделил, чтобы выводить разным шрифтом — дата/время крупнее.

Далее. Строки 61–62 формируют черный прямоугольник с датой и временем, а 63–64 — с прочей инфой соответственно. Они однотипны, рассмотрим одну пару:

convert -background black -fill white $TIME_FONT -gravity east label:"$time" "$time_png"
mogrify -border 2 -bordercolor black "$time_png"

convert создает новый файл, а mogrify изменяет уже существующий (в данном случае всего лишь добавляет рамку).

Переменная $TIME_FONT должна развернуться в параметры шрифта — по умолчанию там будет '-pointsize 16', в настройках, которые я сам использую — '-pointsize 16 -font ConsolaMono'. Думаю, способ задания шрифта понятен.

Ключи -background, -fill и -bordercolor задают цвета фона, текста и рамки соотвественно; -border — толщина рамки; -gravity — выравнивание (east означает «вправо», для текста — по правому краю, для даты/времени это неважно, а вот другая информация у нас многострочная).

Выражение label:"$time" стоит на месте имени входного файла. Ну, собственно, это входные данные для преобразования и есть.

Строки 65–66 формируют надпись окончательно:

convert -background black -gravity east -append "$time_png" "$info_png" "$stamp_png"
mogrify -border 10 -bordercolor black -alpha set -channel A -evaluate set 30% "$stamp_png"

Ключ -append склеивает две картинки в одну с учетом выравнивания и заливает недостающие области цветом фона.

Выражение «-alpha set -channel A -evaluate set 30%» не очень-то осмысленно разбивается по отдельным ключам, а в со­во­куп­нос­ти означает: добавить альфа-канал и установить значения его пикселей в 30%.

Может сложиться впечатление, что ImageMagick тоже написан на Perl’е, или еще на какой разновидности BrainFuck’а. Но это не так, просто он очень универсален и потому сложен.

И венчает обработку строка 68, которая сама по себе — целый скрипт:

convert \( -resize "$OUTPUT_SIZE" "$source" \) -gravity southeast "$stamp_png" -geometry +20+20 -composite -strip -quality 80 "$OUTPUT_PREFIX$name.jpg"

Внутри скобок, как можно догадаться, мы банально изменяем размер исходного файла (-resize). Затем накладываем (-composite) подготовленный штамп в «юго-восточный» угол (-gravity) с отступами 20px от обеих сторон (-geometry). Далее вырезаем из получившегося данные EXIF (-strip) и задаем качество (-quality) конечного файла в 80 условных единиц (читай — процентов, поскольку задается оно в диапазоне 1–100).

В итоге мы получаем возможность в пакетном режиме получать такое:

Тонирование и кадрирование я до того сделал в Darktable, см. предыдущий пост. Почему-то ImageMagick на моих TIFF, полученных из Darktable, выдает кучу предупреждений типа «Unknown field…», но на результат они не влияют.

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

Что касается аналогов, можно присмотреться к Exiv2 и jhead для работы с EXIF, хотя мне они как-то не глянулись. А для ImageMagick есть его клон и форк — GraphicsMagick, который во многом превосходит оригинал.