Командная строка на службе фотографа-линуксоида

Здравствуйте, хабралюди!

Я отношу себя к ленивым фотографам. То есть я не люблю скрупулёзно обрабатывать отснятый материал, но при этом периодически испытываю желание выложить пачечку-другую фотографий в Интернет, желательно быстро.

Для Линукса, которым я пользуюсь практически 100% времени, есть много различных графических инструментов для работы с фото. Но иногда бывает, что нужной функции в используемой программе — нету.
Или она есть, но ты не смог её найти. Что же делать? Конечно же, использовать bash.

Рассмотрим две типовые ситуации.

1) Съёмка велась на несколько фотоаппаратов одновременно, при этом каждый из них сохраняет файлы под различными именами. Например, один создаёт файлы с именами вида DSCFxxxx.jpg, другой — Pxxxxxxxx.jpg.
Для удобства сортировки хотелось бы иметь такие имена, которые с одной стороны — будут более менее унифицированы, с другой — содержать в себе дату и время снимка, чтобы можно было выстроить снимки по порядку в тех окружениях, где не поддерживается сортировка по дате и времени. Для этого нам пригодится программа exiv2.

В этом случае я делаю так. Захожу в каждую из подлежащих обработке директорию с фотографиями и устанавливаю для снимков единый часовой пояс. Предварительно надо посмотреть: какой из многочисленных фотоаппаратов эту директорию создал, и какой был на нём установлен часовой пояс. Например, если фотоаппарат снимал по московскому времени, а нужно установить GMT, отстающее от него летом на 3 часа, то даём такую команду:

exiv2 -a -3 *.JPG

Проверить правильность установки времени можно, выведя на экран новые данные из EXIF:

exiv2 *.JPG | grep 'Отметка времени'

Если всё в порядке — можно переименовать все файлы в директории вот такой командой:

exiv2 -t -r'%Y%m%d-%H%M%S-:basename:' *.JPG

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

Затем переходим в следующую директорию, а после обработки всех запланированных директорий — сливаем результат в одну общую. Получается очень наглядно: ниже приведена выдержка из списка снимков, сделанных в первой половине дня 6 января 2011 года двумя разными фотоаппаратами:

20110106-094958-DSCF2173.JPG
20110106-101332-P1250178.JPG
20110106-101410-P1250180.JPG
20110106-122204-DSCF2188.JPG
20110106-122216-DSCF2190.JPG


2) Допустим, вы залили ваши фотографии на Пикасу. И теперь хотите опубликовать их, например, в своём блоге. Быстро сгенерировать необходимый HTML-код вам поможет сайт picasa2html.com
Но вот незадача — он не вставляет шаблоны для подписей к фотографиям!
Правильный подход — написать собственный аналогичный сервис.
Но это долго, да и времени хронически не хватает. Мы же воспользуемся быстрым подходом.

Берём текст, сгенерированный сайтом, и записываем его в файл с именем photos1.txt.
После чего даём команду

sed '/<p.*p>/d' photos1.txt | sed 's/<\/a>/<\/a>\n00. xxx\n\n/gpw photos2.txt'

Что она делает? Первый вызов sed вырезает логотип picasa2html, оформленный в виде отдельного абзаца.
Второй вызов sed берёт с конвейера результат работы первого (чистые ссылки на фото), и вставляет после каждой фотографии шаблон для её подписи (если вы подписи ставите сверху — скрипт легко переделать).

Таким образом исходные блоки кода вида

<a href="https://picasaweb.google.com/111237353143627593504/201103#5651154095475647410"><img src="1450822379562064245147" border="0"></a><br>
<a href="https://picasaweb.google.com/111237353143627593504/201103#5651154138485468866"><img src="1450822379849647876873" border="0"></a><br>
<a href="https://picasaweb.google.com/111237353143627593504/201103#5651154208871818754"><img src="http://lh6.ggpht.com/-DxT6hGi6-QQ/Tmzuz9bCJgI/AAAAAAAACD0/uqoRVuuFqCs/s720/DSCF7467.JPG" border="0"></a><br>


превращаются в блоки вида

<a href="https://picasaweb.google.com/111237353143627593504/201103#5651154095475647410"><img src="1450822379562064245147" border="0"></a><br>
00. xxx
<br>
<br>
<a href="https://picasaweb.google.com/111237353143627593504/201103#5651154095475647410"><img src="1450822379562064245147" border="0"></a><br>
00. xxx
<br>
<br>
<a href="https://picasaweb.google.com/111237353143627593504/201103#5651154138485468866"><img src="1450822379849647876873" border="0"></a><br>
00. xxx
<br>
<br>


Берём результат из файла photos2.txt, вставляем в блог, и уже по месту редактируем подписи, заменяя нолики на осмысленные номера, а «xxx» — на осмысленные подписи.
Почему я не сделал автонумерацию? Да потому что на мой взгляд переставлять фотографии удобнее всего уже в посте, и поэтому нумерация станет окончательной только непосредственно перед публикацией.

Мой пост — далеко не исчерпывающий, и он приглашает к диалогу.
Было бы интересно послушать единомышленников. Часто ли вы пишете скрипты для обработки фото вместо того, чтобы пользоваться графическими инструментами? Быть может, есть, чем поделиться?
Поделиться публикацией

Комментарии 54

  • НЛО прилетело и опубликовало эту надпись здесь
      +6
      > Кстати, может-ли кто-нибудь показать на BASH, как сделать такой простенький скрипт
      > в одну строчку, чтобы у них не изменялись имена?

      Использовать mogrify вместо convert.
        +10
        закинет все в поддиректорию resized/

        for PHOTO in *.[jJ][pP][gG]; do convert -resize 800x $PHOTO resized/$PHOTO; done
        • НЛО прилетело и опубликовало эту надпись здесь
            +1
            Для баша есть такая опция: nocaseglob.

            $ touch 1.{J,j}{P,p}{G,g}
            $ ls
            1.jpg 1.jpG 1.jPg 1.jPG 1.Jpg 1.JpG 1.JPg 1.JPG jpg jpG jPg jPG Jpg JpG JPg JPG
            $ for i in *.jpg ; do echo $i ; done
            1.jpg
            $ shopt -s nocaseglob
            $ for i in *.jpg ; do echo $i ; done
            1.jpg
            1.jpG
            1.jPg
            1.jPG
            1.Jpg
            1.JpG
            1.JPg
            1.JPG
              +2
              Кавычки не забудьте!

              for PHOTO in *.[jJ][pP][gG]; do convert -resize 800x "$PHOTO" «resized/$PHOTO»; done
                0
                Действительно, спасибо.
              –7
              Всем ли так нужна консоль? Не лучше ли пользоваться XnView MP с человеческим интерфейсом? Вьювер, каталогизатор и вообще комбайн, приятный и отшлифованный UI, есть гибкие возможности по пакетной обработке, поддерживает тьму форматов.
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  У ней как бы иное предназначение. Сомневаюсь, что многие фотографы одновременно являются настолько гиками, что захотят заморачиваться с консольными утилитами, хостингами и API.
                  А вообще тот же разработчик предлагает консольный NConvert, если кому-то ImageMagick не нравится.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Хм. если на фотике стоит никсовая система, к кому причислить их владельцев.
                        +1
                        Это что за фотик такой? Телефон с Андроидом? :)
                      0
                      Кстати, nconvert действительно хорошая штука, пользовался им.
                      Но сходу не вспомню — в чём он реально опережает ImageMagick.
                        0
                        ну например, я перешел на imagemagic из-за функции smart-resize (уменьшение картинки по БОЛЬШЕЙ стороне)
                    +7
                    Консоль не заменяет UI-приложения, но удачно их дополняет. Когда я сливаю фотографии с карточки в mc и запускаю скрипт для стандартной подготовки, это происходит очень быстро, с минимумом кликов и зрительного напряжения и при этом трудно ошибиться. С UI-программами — надо запустить прогу, найти каталог, выбрать правильные файлы, выбрать нужное действие… а скрипт уже давным-давно всё закончил.
                      0
                      Только XnView долгие годы развивали лишь виндовую версию, а под линуксом и FreeBSD была доступна лишь страшная 1.70.
                        0
                        XnView MP переписывается с нуля под Qt, если вы не заметили, и в недалёком будущем будет иметь все достижения Windows версии
                    +5
                    Часто использую mogrify для ужатия фоток и jhead для поворота по EXIF:
                    mogrify -resize 640 *.jpg
                    jhead -autorot *.jpg
                      +2
                      Похоже, вторая команда — именно то, что я запрашивал в комменте ниже :) Спасибо.
                      +1
                      Кстати, ещё две идеи для фотоскриптов:
                      1) Я ещё не разобрался в причине, но некоторые сайты, принимающие к загрузке фото, не поворачивают вертикально ориентированные картинки согласно ориентации в EXIF. Приходится делать это вручную в GIMP. А вот был бы скрипт, который можно натравливать на директорию со всеми фотками — было бы хорошо.
                      2) Скрипт для впечатывания копирайта. С горизонтальными снимками всё просто — ставь в какой-нибудь угол заранее определённый, и ладно. Правда, там может оказаться светлая область — тогда бы неплохо тёмным текстом написать, вот тоже задачка :) А вот на вертикальных как ставить — это тоже вопрос, в другой какой-то угол или вдоль вертикальной стороны повёрнутым… В любом случае скрипт должен ориентацию отслеживать.
                        +1
                        Погуглить религия не позволяет? Всё есть в примерах к ImageMagick.

                        1. Тыц, читать весь раздел, там есть ссылка на программу JHead.
                        2. Тыц. Технология простая — берём png-файл и накладываем его на картинку в нужном месте.

                        Почитайте документацию и посмотрите примеры, там мноого интересного.
                          0
                          Так я ж просто идеями делюсь в данном комменте :)
                          По п.1 мне уже подсказали.
                          По п.2 технология как раз понятна, идея заключалась в том, чтобы написать мега-скрипт, который ставит картинку в разные места в зависимости от ориентации снимка, и разными цветами — в зависимости от фона.
                            +4
                            Обычно народ не парится и делает либо так:

                            image

                            либо так:

                            image

                            И то, и другое отлично читается на любом фоне. Получение типа ориентации снимка тоже довольно тривиальная задача:

                            #!/bin/bash
                            
                            # Определяем отношение ширины картинки к высоте
                            # Если оно меньше 1 - это портрет, равно - квадрат, больше - пейзаж
                            RATIO=`identify -format %[fx:w/h] $1`
                            
                            if [ $RATIO == "1" ]; then
                                echo "square"
                            else
                                RAT_NUM=`echo $RATIO | sed -e 's/\(.\).*/\1/'`
                                if [ $RAT_NUM -eq 0 ]; then
                                    echo "portrait"
                                else
                                    echo "landscape"
                                fi
                            fi
                            


                            Зная ориентацию легко расположить надпись или картинку в нужном месте, см. вторую ссылку.
                              0
                              Да, графический дизайнер из меня не вышел бы, раз я не додумался до такого очевидного трюка с логотипом. Впрочем, оно и хорошо, что я не дизайнер :)
                                +3
                                Зачем придумывать, если можно подсмотреть? :)
                              +1
                              Для imagick (PHP-интерфейс к ImageMagick) такой скрипт есть. Я давно использую на своем сайте, безмерно благодарна автору. Думаю, если поковыряться в нем — можно для консоли сделать аналог.
                                0
                                Думаю, лучше будет выглядеть текст, как на рабочем столе, вроде, любой системы (тонкая обводка белого текста черным цветом и небольшая тень)
                              • НЛО прилетело и опубликовало эту надпись здесь
                                +1
                                А вот об этом — следующий топик. С примерами кода (и автоматический поворот, и подписывание) да ссылкой на гитхаб, откуда можно взять готовые скрипты.
                                  +2
                                  1. exiftran

                                  exiftran is a command line utility to transform digital image jpeg
                                  images. It can do lossless rotations like jpegtran, but unlike
                                  jpegtran it cares about the EXIF data: It can rotate images
                                  automatically by checking the exif orientation tag, it updates the
                                  exif informaton if needed (image dimension, orientation), it also
                                  rotates the exif thumbnail. It can process multiple images at once.

                                  2.
                                  #!/bin/sh
                                  mkdir converted

                                  #for i in *.[nN][eE][fF]
                                  for i in *.[jJ][pP][gG]
                                  #for i in *.[pP][pP][mM]
                                  do
                                  convert $i -resize 800x600 -font helvetica -pointsize 16 -draw «gravity SouthEast fill gray text 0,1 'www.slk.by' fill white text 1,0 'www.slk.by' » converted/`basename "$i" .JPG`.jpg && \
                                  exiftool -overwrite_original -Copyright='www.slk.by' converted/`basename "$i" .JPG`.jpg
                                  done
                                    0
                                    О, тут ещё и текст консольно рисуется, хорошая идея :)
                                  +4
                                  Для работы с Пикасой из командной строки можно использовать утилиты проекта googlecl. С помощью этих утилит можно и закачивать фотографии в альбом, и получать всю необходимую информацию.
                                  Получить список всех фотографий из альбома можно примерно такой командой:

                                  google picasa list --fields title,url,url-direct,summary "Боброво, 31.07-07.08.2010"


                                  Вывод получается такой (показываю только одну строку):

                                  IMG_1781.JPG,https://picasaweb.google.com/114460296623519085576/310707082010#5503164146046045314,http://lh3.ggpht.com/-JsZrrcj1wa0/TF8qokG9jII/AAAAAAAAEvQ/GXHGUE3VX48/IMG_1781.JPG,Лицо. Вообще это какая-то щавельница (я не запомнил точное название).

                                  Как вы понимаете, распарсить эту строку проще простого. Плюс в том, что если озаботиться добавлением описания фотографии в Пикасе, то галерею для блога можно формировать полностью автоматически — описания подставятся сами. Если описания нет, в поле summary будет стоять None.
                                  Для получения адреса preview нужно немного подправить полученный урл — перед именем файла добавить название папки вида s<размер по длинной стороне>. То есть если нужна превьюшка файла из моего примера с размером 345px, урл должен стать таким:

                                  http://lh3.ggpht.com/-JsZrrcj1wa0/TF8qokG9jII/AAAAAAAAEvQ/GXHGUE3VX48/s345/IMG_1781.JPG


                                  Это тоже прекрасно автоматизируется :)
                                    0
                                    О, отличная штука, надо будет исследовать при наличии времени, спасибо!
                                    +2
                                    Я на все JPEG-файлы натравливаю скрипт fromcam, который:

                                    1. Переименовывает примерно так: 2011-09-12 13:14:15 DSC_1235.jpg
                                    2. Выполняет поворот «портретных» фотографий.
                                    3. Добавляет JPEG Comment с моим копирайтом.

                                    Дополнительно есть вариации скрипта fromcam-others (для чужих фотографий), и fromcam+1 и fromcam-1, которые корректируют время съёмки на +1 час или -1 час, соответственно.

                                    Ещё есть скрипт forweb <качество JPEG> <макс. ширина> <макс. высота>, который уменьшает фотки с шарпингом, очень удобно, когда нужно по сети передать большую кучу фотографий и допустимо их уменьшить.

                                    Самих скриптов под рукой нету, но если кто-то хочет посмотреть, то черкните комментарий, потом выложу.
                                      0
                                      ...forweb ещё EXIF удаляет, на всякий случай.
                                        0
                                        С файлами, у которых в имени двоеточие, потом не удобно работать под Windows
                                          0
                                          На самом деле, там его нету, просто я ошибся, а исправить нельзя :)

                                          2011-09-12 131415 DSC_1235.jpg
                                          0
                                          Некоторые фотоаппараты можно настроить так, чтоб они писали в комментарий в EXIF (почти) произвольный текст. Например, Nikon D40 пишет латинским буквами, цифрами и знаками препинания; размер поля — около 40 символов, на имя с адресом сайта вполне может хватить.
                                            0
                                            У меня в хозяйстве 7 фотографирующих девайсов, причём ими пользуются разные люди.
                                          +3
                                          Снимаю time lapse видео, для генерации превьюшек видео из кучи фотографий написал скриптик lapse.

                                          mencoder «mf://*.JPG» -mf fps=30 -o "$1".avi -ovc lavc -vf scale=800:600 -lavcopts vcodec=msmpeg4v2:vbitrate=2000

                                          Запуск lapse test сгенерит файл test.avi.
                                          Пример результата dl.dropbox.com/u/4494944/v/lapse7-600-2k.avi (4МБ)
                                            0
                                            Ух ты. Круто. В свое время искали на работе способ сделать видео из картинки (чтоб рекламу простенькую транслировать). Там в конце концов в ход пошли тяжелые видеоредакторы, а тут вон оно как просто.
                                            +1
                                            mogrify -resize 1000 *.jpg
                                              –6
                                              Потрясающе, на что идут люди, чтобы не пользоваться каталогизаторами фотографий.
                                                +3
                                                А каталогизатор-то тут при чём? Никто не запрещает им пользоваться для организации фотографий в некую структуру. И обрабатывать их скриптами при необходимости.
                                                  0
                                                  При том, что каталогизатор может выполнить всю эту работу без нагромождения скриптов.
                                                    0
                                                    По природе своей скрипты более гибки, т.к. юзер может использовать только те, что нужны ему, и при этом не продираться мышью через тучи галочек и кнопочек универсальных мегапрограмм.

                                                    Ну ладно, а есть ли каталогизатор, который делает хотя бы всё то, что описано в этом топике и в комментах? :)
                                                      +2
                                                      Lightroom может переименовывать файлы по любой маске, вставлять копирайты и прочее.

                                                      А юзер скрипты не может использовать по определению.
                                                        0
                                                        Мы тут Linux вообще-то рассматриваем. Ради элементарных действий предлагаете запускать Lightroom под Wine (а будет ли работать)? Или вообще в виртуальной машине?

                                                        С толкованием термина «юзер» тоже можно поспорить. Но лучше не стоит, чтобы не уходить в жёсткий оффтопик.
                                                          +1
                                                          Lightroom это та программка, которой пользуются те, кто о CaptureOne не знает?

                                                          Для некоторых действий скрипты удобнее во много раз.
                                                            +1
                                                            LR vs C1 vs Aperture это такой же холивар, как *nix vs Mac vs Win. С1 не лучше и не хуже других. Каждому свое.
                                                    +3
                                                    Потрясающее, сколько кликов мышкой делают люди, чтобы не учить команды консоли :)
                                                    +2
                                                    Некоторое время назад написал GUI обертку для convert, возможно кому пригодится: Simple Images Converter.

                                                    P.S. Она не призвана заменить скрипты, у всего свои цели.
                                                      +1
                                                      еще есть десктопный phatch.org
                                                      Очень хорош.

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

                                                      Самое читаемое