Пакетное извлечение превью из raw


Третий день слушаю в свободное время подкаст Фотокомпас. Странный подкаст, начиная с того, что выпуски длиной по два часа, и заканчивая невменяемым макодрочерством одного из ведущих. Ну как можно пять минут обмусоливать, какие классные цветные лейблы в Finder?

Однако, готов простить всё за мимолётом оброненную фразу о том, что в raw изначально встраивается jpeg-превью. Значит можно снова снимать в чистый raw, а не в raw+jpeg. Осталось научится извлекать эти превью.

Итак, имеем более 42 тысяч NEF-файлов (бОльшую часть из них можно смело удалить), для которых нужно сделать превью.

В Ubuntu извлечь превью могут несколько утилит. Нет, я не обрабатываю RAW на линуксе, но весь фотоархив хранится на компьютере с Ubuntu, так что и извлекать превью стоит сразу на нём. Тем более, что пакетную обработку лучше делать именно в консоли.

Exiv2

Первой была испытана exiv2.

$ exiv2 -ep3 dsc_1234.NEF

-ep — extract preview, ну а тройка — номер превью из набора (из моих никоновских файлов можно выдернуть маленький tif, средний jpeg и большой jpeg).

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

ImageMagick

Идём дальше и тыкаем палочкой в imagemagick. Он поддерживает NEF на уровне декодирования, поэтому пробуем узнать, что у нас есть в файле:

$ identify dsc_1234.NEF

Процесс успешно падает из-за отсутствия ufraw-batch, и я не вижу смысла продолжать с ImageMagic.

DCRaw

Третьим кандидатом оказывается dcraw, и его можно попросить извлечь превью этой простой командой:

$ dcraw -e dsc_1234.NEF

Превью успешно извлекается со всеми необходимыми метаданными (из которых реальную ценность представляет только Exif.Photo.Orientation).

Теперь нужно пробежаться по всем файлам архива и нагенерить превьюшек:

$ find /data/photo/ -iname '*.nef' -exec dcraw -e {} \;

Ищем все *.nef файлы без учёта регистра и для каждого файла выполняем команду извлечения превью. Имя файла передаётся в шаблон {}, а \; означает, что команда закончилась. И, заметьте, никакой пляски с бубнами и for.

PS: у некоторых файлов всё-таки не оказалось встроенного превью, но, возможно, они вообще битые.