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

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-05-15 16:53:16

может опыт будет кому-то полезен:

ходили в поход, на группу было 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) исходные файлы удаляются.
Последний раз редактировалось romzes 2008-05-24 1:03:56, всего редактировалось 1 раз.
TMTOWTDI

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-19 19:17:16

а на сайт?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-05-23 11:11:57

а какой номер раздела мелочи?
TMTOWTDI

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-25 18:39:00

romzes писал(а):а какой номер раздела мелочи?
мона публиковать?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-25 18:40:43

если есть возможность - сделай эти строки:

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

$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".
с переносом.
по ширине немного не вписывается...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-25 22:19:52

статья ушла в продакшен =))
http://www.lissyara.su/?id=1673
Убей их всех! Бог потом рассортирует...

Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-05-25 22:27:06

как раз успел подкорректировать =)
TMTOWTDI

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-25 22:33:12

romzes писал(а):как раз успел подкорректировать =)
наоборот.
я увидел что ты скорректировал - и опубликовал.
========
проглядеол - описание коротковато - не находишь? =)
Убей их всех! Бог потом рассортирует...

Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-05-25 22:41:18

lissyara писал(а):проглядеол - описание коротковато - не находишь?
описание скрипта или exif, где доработать?
TMTOWTDI

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-25 22:58:42

пример работы с полями Exif из консоли
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-25 23:02:27

есть ещё на сайте грязный хак - для кода...
посмотри - лучше стал листинг или нет...
если нет - убери...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
romzes
мл. сержант
Сообщения: 85
Зарегистрирован: 2007-09-05 22:17:34
Откуда: Київ
Контактная информация:

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

Непрочитанное сообщение romzes » 2008-05-26 1:35:46

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2008-05-26 9:53:53

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

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$  
сегодня пригодилось =)))
осортировал по датам и разложил в директории.
Убей их всех! Бог потом рассортирует...