Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Русификация
  COM-порт
  Монтирование образов
  dd
  burncd
  Консоль
  polling
  redirect_port
  wolf3d
  W.O.L.
  HDD->HDD
  bsdstats
  pdf в html
  monitord
  monit
  dvd в avi
  LAM
  Контроль провайдера
  pppd
  ru man
  geom_uzip
  colorize
  nettop
  немного о ssh
  установка по сети
  ClamAV mirror
  BlueTooth
  WiFi WPA
  iftop
  iPod
  2 CD -> 1 DVD
  ipcalc
  LACP и VLAN
  FFS из-под WinXP
  queues
  NFS & Win2k3
  Dynamic DNS
  ProFTPD+iconv
  deltup, xdelta, bdelta
  Приглашение csh/tcsh
  настрока bash
  Lan over Bluetooth
  pppoe
  метаданные exif
  dd : бэкапируем windows
  mozilla autoconfig
  Proxy Auto Configuration
  NNTP сервер
  Rinetd
  ISO DVD FreeBSD
  my disc1
  sftp+chroot
  SendXMPP
  APCUPSD
  Видеонаблюдение
  Настройка аудиоплеера на ximp3
  HDD(mbr) -> HDD(gpt)
  mc 4.6.2
  Динамический DNS
  axel
  LiveCD
  NAS на MPD
  backup конфигов на почту
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> метаданные exif

Exif и сортировка фотографий

Автор: 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" (названые в таком формате, фотографии всегда будут идти в хронологическом порядке, если отсортировать их по имени, что и делают по дефолту куча просмотрщиков).
так это выглядит в консоли:
%pwd
/usr/home/romzes/photos
%ls
IMGP0333.JPG
  //читаем метаданные снимка: 
 //"--ifd EXIF" - хранилище, "-t 0x9003" - интересующий тег.
 //exif -l IMGP0333.JPG позволит посмотреть все теги снимка
 //если напротив некоторых индексов нет описаний - обнулите LANG в шеле
%exif --ifd EXIF -t 0x9003 IMGP0333.JPG
EXIF entry '' (0x9003, '') exists in IFD '':
Tag: 0x9003 ('DateTimeOriginal')
  Format: 2 ('ASCII')
  Components: 20
  Size: 20
  Value: 2008:04:30 08:18:50
 //вытягиваем дату "2008:04:30 08:18:50", скармливаем ее для date
 //допустим, уменьшаем ее на 5 часов, 12 минут, и выдаем в том же
 //формате. (команда date рулит=) )
%date -j -v-5H -v-12M -f "%Y:%m:%d %T" "2008:04:30 08:18:50" "+%Y:%m:%d %H:%M:%S"
2008:04:30 03:06:50
 //то же самое, только формат вывода другой:
%date -j -v-5H -v-12M -f "%Y:%m:%d %T" "2008:04:30 08:18:50" "++%Y%m%d%H%M.%S"
200804300306.50
 //теперь нужно записать в тег изображения новую дату
 //да и сам файл переименовать:
%exif --ifd EXIF -t 0x9003 -o Crimea200804300306.50.jpg --set-value \
 "2008:04:30 03:06:50" IMGP0333.JPG
Wrote file 'Crimea200804300306.50.jpg'.
 //проверяем
%ls
Crimea200804300306.50.jpg  IMGP0333.JPG
%exif --ifd EXIF -t 0x9003 Crimea200804300306.50.jpg
EXIF entry '' (0x9003, '') exists in IFD '':
Tag: 0x9003 ('DateTimeOriginal')
  Format: 2 ('ASCII')
  Components: 20
  Size: 20
  Value: 2008:04:30 03:06:50

для автоматизации процеса был написан небольшой перловый скриптик.


#!/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
....
$time_cor='-v-6H -v-3M';
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Anton/*
....
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
$time_cor='-v+1H -v-18M';
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Vitalik/*
....
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
$time_cor="";
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Yurets/*
....

Все.
Скрипт приведён в качестве примера и не претендует на более-менее приемлемый. Если все-таки решили его использовать бездумно - знайте: a) скрипт складывает out файлы в текущий каталог, если не указать иного в переменной $name_pr (напр. $name_pr="/home/romzes/photo/Crimea" - причем Crimea - префикс имени файла); b) исходные файлы удаляются.



Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?t=8644.

размещено: 2008-05-25,
последнее обновление: 2008-05-26,
автор: Romzes

оценить статью:


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS

Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT

В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat

Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp

Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration

Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster

HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS

История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire

Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной

Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
2011-01-21, m4rkell
Syslog server

Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 7 чел.
За последние 30 мин было: 40 человек
За сегодня было
23 показов,
7 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0367 секунд
Из них PHP: 35%; SQL: 65%; Число SQL-запросов: 77 шт.
Исходный размер: 129240; Сжатая: 22114