суббота, 9 января 2010 г.

Переименование фотографий по EXIF-тегам

В августе-сентябре прошлого года я ездил в отпуск в компании из пяти человек. На всю компанию было два цифровых фотоаппарата. Отдыхали в другом часовом поясе и в середине отпуска мне приспичило выставить на своём фотоаппарате второе время. По приезду из отпуска мы обменялись фотографиями. Я слил все фотографии в один каталог, попутно переименовав их в соответствии со временем из EXIF-тегов.

Время на фотоаппаратах несколько различалось в начале поездки, поэтому итоговые фотографии были слегка перемешаны, к чему я был готов. Но вот что было неожиданным, так это то, что функция двойного времени на моём фотоаппарате не прописывала оба времени в снимок. Если задано одно время, то в EXIF-теги прописывалась информация о первом времени, а если заданы оба времени, то в EXIF-теги прописывалась информация из второго времени. Поэтому кроме небольшого перемешивания в начале, с некоторого момента фотографии с разных фотоаппаратов перемешались с разницей в 2 часа.

Для начала я решил всё вернуть на место и разделить фотографии по фотоаппаратам. Один из фотоаппаратов прописывал в EXIF-теги название модели "Canon PowerShot A560", поэтому я выделил с помощью grep и xargs все фотографии с этого фотоаппарата в отдельный каталог:
$ mkdir canon
$ grep -Ul "Canon PowerShot A560" | xargs -n1 -I'{}' mv '{}' canon/
Оставшиеся фотографии были с первого фотоаппарата и я поместил их в другой каталог под именем olympus.

Далее, просматривая фотографии, я сначала нашёл тот момент, когда я прописал второе время. А затем нашёл два практически одинаковых снимка, сделанных с разных фотоаппаратов, но в разных ракурсах. Так я узнал разницу в синхронизации часов - она составляла 36 секунд.

Теперь о главном. В результате поиска инструмента, который бы мог перевести время в EXIF-тегах, я нашёл утилиту exiftool. Оказалось, что эта утилита не только умеет менять время в EXIF-тегах, но и умеет переименовывать фотографии в соответствии с тегами. Она также поддерживает редактирование не только EXIF-информации из JPEG-файлов, но и редактирование тегов музыкальных файлов, например MP3. Подробнее об утилите можно прочитать здесь: http://www.sno.phy.queensu.ca/~phil/exiftool/. Я же остановлюсь на тех полезных функциях, которые мне пригодились именно для решения моих проблем: корректировка времени в EXIF-тегах и переименование.

Для начала поставим пакет с утилитой:
# aptitude install libimage-exiftool-perl
Теперь, для корректировки времени можно воспользоваться следующей командой (сначала я скорректировал разницу в часах между двумя фотоаппаратами):
$ exiftool "-AllDates-=0:0:0 0:0:36" olympus/moscow-time/
$ exiftool "-AllDates-=0:0:0 0:0:36" olympus/ufa-time/
Потом я ещё раз скорректировал время (ликвидировав разницу в часовых поясах между снимками):
$ exiftool "-AllDates+=0:0:0 2:0:0" olympus/moscow-time/
Знак плюс или минус говорит о том, нужно ли прибавить разницу к показаниям часов или отнять её. Следующие шесть цифр, разделённых двоеточиями и пробелами, указывают разницу в годах, месяцах, днях, часах, минутах и секундах.

И так, теперь время во всех EXIF-тегах фотоснимков синхронизировано и нужно их переименовать. Раньше я это делал с помощью пакета exifprobe, в соответствии с этой статьёй: Цифровые фотографии. Наводим порядок. Однако exiftool оказался способен заменить эту статью одной строчкой:
$ exiftool -r -d %Y%m%d-%H%M%S%%-c.jpg "-filename<DateTimeOriginal" .
Опция -r означает, что фотографии нужно искать и в подкаталогах указанного каталога - рекурсивно.

Строка %Y%m%d кодирует 4 цифры года, две цифры месяца, две цифры дня. Строка %H%M%S кодирует две цифры часов в 24-часовом формате, две цифры минут, две цифры секунд. Строка %%-c используется при наличии нескольких файлов с одинаковым именем, при повторах она добавляет знак минус и номер файла. Строка .jpg указывает расширение файла.

Теперь все фотографии синхронизированы по времени, переименованы в соответствии с датой и временем, одновременно сделанные фотографии снабжены номером.