Страница 1 из 1

EXIF и сортировка фоток.

Добавлено: 2008-05-15 16:53:16
romzes
может опыт будет кому-то полезен:

ходили в поход, на группу было 3 фотоаппарата. Дошло дело до фоток - захотелось отсортировать изображения в хронологическом порядке.

Каждый фотык называет файлы по разному. Сортировать по датам модификации/создания файлов не получилось, т.к. они изменены при разных условиях(копирование на комп, редактирование и т.д.).
У каждой фотографии есть хранилище метаданных которое, насколько я понял, может быть отображено в разных форматах (EXIF,XMP). Полей там много, среди них: ескпозиция, была ли задействована вспышка, дата создания, дата оцифровки, и т.д.
Меня интересовала только дата создания, как потенциальный критерий для сортировки.
полез в порты:

Код: Выделить всё

[romzes] /usr/ports> make quicksearch name=exif
Port:   exif-0.6.15
Path:   /usr/ports/graphics/exif
Info:   Command line utility to read and manipulate EXIF data
....
[romzes] /usr/ports> cd /usr/ports/graphics/exif && make install clean

Как выяснилось каждый фотоаппарат жил в своём собственном времени, но это не проблема - посмотрев фотографии, можно на глаз вычислить смещение времени между фотоаппаратами (взяв время какого-то одного за еталон), и привести даты EXIF всех фотографий, к общему времени и отсортировать по дате из EXIF.

решил, что буду корректировать дату создания в EXIF, и файлы называть так "CrimeaYYYYMMDDHHMM.SS.jpg".
был написан небольшой перловый скриптик:

Код: Выделить всё

#!/usr/bin/perl

#Префикс имени файла
$name_pr="Crimea";
#смещение времени. Например: "-v-1H -v-32M -v+18S" - уменьшить исходную дату на 1 час 32 минуты но увеличить на 18 секунд (подробнее man date )
$time_cor='-v-6H -v-3M';
#если не нужно изменять дату можно установить переменную так:
#$time_cor="";

#можно передавать скрипту несколько файлов на обработку, или в виде Photo012*
while (@ARGV) {
$ARGV= shift @ARGV;
print "file: $ARGV\n";



#Вытягиваем EXIF дату создания
$command='exif --ifd EXIF -t 0x9003 ' . $ARGV . q< | awk '/Value:/ {printf $2 " " $3}'>;
#Если раскомментировать, можно увидеть как будет выглядеть команда
#print "command: # $command\n";
$exif_date=`$command`;


# Корректируем полученную дату и конвертируем ее к виду YYYYMMDDHHMM.ss (здесь я зауважал команду date)
$command="date -j $time_cor " . ' -f "%Y:%m:%d %T" "' . $exif_date . '" "+%Y%m%d%H%M.%S"';
#Если раскомментировать, можно увидеть как будет выглядеть команда
#print "command: # $command\n";
@touch_date=split(/\n/,`$command`);

# То же что и предыдущая команда, только другой формат на выходе: YYYY:MM:DD HH:MM:SS
$command="date -j $time_cor " . ' -f "%Y:%m:%d %T" "' . $exif_date . '" "+%Y:%m:%d %H:%M:%S"';
#print "command: # $command\n";
@exif_date=split(/\n/,`$command`);

# записываем новую дату и меняем имя файла
# если файл на выходе и входной совпадают по имени - не удаляем старый
if ("$name_pr$touch_date[0].jpg" eq "$ARGV") {
        $command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0].jpg" . ' --set-value "' . $exif_date[0] . '" '.$ARGV;
        `$command`;
# если файл на выходе совпадает с другим существующим - добавляем суффикс
  } elsif (-e "$name_pr$touch_date[0].jpg") {
        $suffix=0;
        while (-e "$name_pr$touch_date[0]$suffix.jpg") {
                $suffix++;
                }
        $command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0]$suffix.jpg" . ' --set-value "' . $exif_date[0] . '" '.$ARGV;
        `$command`;
        print `rm -rf $ARGV`;
# если имя файла на выходе не совпадает с другими файлами - записываем.
  } else {
        $command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0].jpg" . ' --set-value "' . $exif_date[0] . '" '.$ARGV;
        `$command`;
        print `rm -rf $ARGV`;
        }


}
допустим фотографии из трех фотоаппаратов лежат в директориях ~/Anton ~/Vitalik ~/Yurets
отсортированные фото я ложу в директорию ~/Sorted

Код: Выделить всё

---захожу туда, куда складывать фото.
[romzes] /home/romzes> cd ~/Sorted
[romzes] /home/romzes/Sorted> which chtime.pl
/home/romzes/bin/chtime.pl
---редактирую смещение времени для каждого фотоаппарата
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Anton/*
....
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Vitalik/*
....
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Yurets/*
....
Все.
Скрипт приведён в качестве примера и не претендует на более-менее приемлемый. Если все-таки решили его использовать бездумно - знайте: a) скрипт складывает out файлы в текущий каталог, если не указать иного в переменной $name_pr (напр. $name_pr="/home/romzes/photo/Crimea" - причем Crimea - префикс имени файла); b) исходные файлы удаляются.

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-19 19:17:16
Alex Keda
а на сайт?

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-23 11:11:57
romzes
а какой номер раздела мелочи?

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 18:39:00
Alex Keda
romzes писал(а):а какой номер раздела мелочи?
мона публиковать?

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 18:40:43
Alex Keda
если есть возможность - сделай эти строки:

Код: Выделить всё

$command='exif --ifd EXIF -t 0x9003 ' . $ARGV . q< | awk '/Value:/ {printf $2 " " $3}'>;

Код: Выделить всё

# То же что и предыдущая команда, только другой формат на выходе: YYYY:MM:DD HH:MM:SS

Код: Выделить всё

$command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0]$suffix.jpg".
с переносом.
по ширине немного не вписывается...

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 22:19:52
Alex Keda
статья ушла в продакшен =))
http://www.lissyara.su/?id=1673

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 22:27:06
romzes
как раз успел подкорректировать =)

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 22:33:12
Alex Keda
romzes писал(а):как раз успел подкорректировать =)
наоборот.
я увидел что ты скорректировал - и опубликовал.
========
проглядеол - описание коротковато - не находишь? =)

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 22:41:18
romzes
lissyara писал(а):проглядеол - описание коротковато - не находишь?
описание скрипта или exif, где доработать?

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 22:58:42
Alex Keda
пример работы с полями Exif из консоли

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-25 23:02:27
Alex Keda
есть ещё на сайте грязный хак - для кода...
посмотри - лучше стал листинг или нет...
если нет - убери...

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-26 1:35:46
romzes
lissyara писал(а):
пример работы с полями Exif из консоли
изменил "краткое содержание" =) ибо exif прост до ужаса, и его единственной страницы мана вполне хватает.
зато показал для чего вообще этот скрипт - нарисовал, как сделать то же, но руками в консольке.
lissyara писал(а):есть ещё на сайте грязный хак - для кода...
как по мне - так читабельнее.

Re: EXIF и сортировка фоток.

Добавлено: 2008-05-26 9:53:53
Alex Keda

Код: Выделить всё

lissyara$ foreach i (`ls`)
foreach? mkdir -p `exif --ifd EXIF -t 0x9003 $i | grep Value: | awk '{print $2}' | tr ":" "_"`
foreach? mv $i `exif --ifd EXIF -t 0x9003 $i | grep Value: | awk '{print $2}' | tr ":" "_"`/
foreach? end
lissyara$   
lissyara$ ls
2008_04_28      2008_05_01      2008_05_05      2008_05_08      2008_05_11      2008_05_15      2008_05_18      2008_05_21
2008_04_29      2008_05_03      2008_05_06      2008_05_09      2008_05_12      2008_05_16      2008_05_19      2008_05_22
2008_04_30      2008_05_04      2008_05_07      2008_05_10      2008_05_14      2008_05_17      2008_05_20
lissyara$  
сегодня пригодилось =)))
осортировал по датам и разложил в директории.