27 октября, 2011

Скрипт для конвейерного производства подписей к фото

Создаём файл /path/to/script (подобные файлы удобно держать в ~/bin) со следующим содержимым:
#!/bin/bash


# Сам текст подписи. Не забудьте поменять!
TEXT="Copyright. Hombit Inc."

for FILE in "$@"
do

# Высота фотки
HEIGHT=`exiftool -ImageHeight $FILE | perl -pe 's/^.*: //'`
# Ширина фотки
WIDTH=`exiftool -ImageWidth $FILE | perl -pe 's/^.*: //'`
# Подпись должна быть небольшой, по-этому она ориентируется на меньшую сторону фотки
MINDIM=`perl -E "use List::Util qw[min]; say min($HEIGHT,$WIDTH)"`
# Размер шрифта, коэффициент 5/2 подобран эмпирически.
FONTSIZE=$(( $MINDIM / (5/2 * ${#TEXT}) ))
# Длина текста в пикселях. Опять же 4/7 подобран эмпирически.
TEXTLENGTH=$(( ${#TEXT} * $FONTSIZE * 4/7 ))
# Отступ подписи от правого края изображения.
HORIND=$(( $MINDIM / 200 ))

# Сама команда преобразования. Расшифровка некоторых опций:
# -fill — цвет подписи. Установлен белый с непрозрачностью в 15%
# -stroke — цвет контура. Для контраста использован чёрный с непрозрачностью в 20%
# -strokewidth — толщина контура в пикселях
# -monitor показывает прогресс обработки
mogrify -pointsize $FONTSIZE \
 -fill 'rgba(255,255,255, 0.15)' \
 -stroke 'rgba(0,0,0, 0.2)' -strokewidth 3 \
 -draw "rotate -90 gravity SouthEast \
  text -$TEXTLENGTH,$HORIND '$TEXT'" \
 -monitor \
$FILE

done

exit 0
Как вы понимаете, нужны ImageMagick и exiftool. Что бы заполучить эти программы на ваш Линукс, выполните одну из следующих команд:
Для Fedora
su -c 'yum install ImageMagick perl-Image-ExifTool'
Для Debian/Ubuntu
sudo apt-get install imagemagick libimage-exiftool-perl
Не забываем сделать файл исполняемым:
chmod +x /path/to/script
Теперь можно взять любую картинку и применить наш скрипт (осторожно, файл с фотографией перезапишется):
/path/to/script photka.jpg
Вот примерно то, что мы получим (кликабельно):
Для массовой обработки можно вопользоваться метасимволами. Например, для того что бы преобразовать все файлы в данной директории, имеющие расширение .jpg или .tif, нужно воспользоваться такой командой:
/path/to/script *.{jpg,tif}
Однако, я предпочитаю сделать тоже самое, но в несколько параллельных потоков, что значительно ускоряет обработку:
ls *.{jpg,tif} | xargs -P4 -iXXX /path/to/script XXX
Число потоков регулируется параметром «-P» и в данном примере равно четырём, подробности смотрите в man xargs.


P.S. Жду ваших отзывов и рекомендаций по улучшению! Мне самому не нравится строчка с MINDIM, в ней пришлось использовать perl, так как не понял как коротко и лаконично искать минимум двух целых чисел с помощью bash.



Комментариев нет:

Отправить комментарий