Exif

Exiftool jhead -ts2012:03:10-08:48:51 IMG_3205.JPG

Изменение EXIF
Задача: есть много кадров с фотоаппарата, у которого неверно была выставлено время. Соответственно, оно и прописалось. Есть ли способы чем-то консольным поправить поле DateTime, увеличив значение в нем на некое количество часов, например +9 часов.

Утилита командной строки http://www.sno.phy.queensu.ca/~phil/exiftool/exiftool_pod.html exiftool -AllDates+=3 photos/

psearch exiftool graphics/p5-Image-ExifTool Perl module for getting EXIF data from image files

Вместе с установкой этой библиотеки и приходит утилита /usr/local/bin/exiftool.

Скрипт на Perl
Установка библиотеки для работы с EXIF make -C /usr/ports/graphics/p5-Image-ExifTool/ install clean

-2 -- это "минус два часа" и потом список файлов. Ко всем полям 2 часа прибавить и всё ./ex.pl -2 IMG_9797.JPG IMG_9797.JPG 2009:06:23 19:37:00 => 2009:06:23 17:37:00 2009:06:21 14:56:45+04:00 => 2009:06:21 12:56:45+04:00 2009:06:23 19:37:00+04:00 => 2009:06:23 17:37:00+04:00 2009:06:23 19:37:00+04:00 => 2009:06:23 17:37:00+04:00 2009:06:21 14:56:45 => 2009:06:21 12:56:45 2009:06:21 14:56:45 => 2009:06:21 12:56:45 2009:06:26 04:26:46+04:00 => 2009:06:26 02:26:46+04:00 2009:06:23 19:37:00+04:00 => 2009:06:23 17:37:00+04:00

ex.pl

 * 1) !/usr/bin/perl

use Image::ExifTool; use Date::Manip;

my $s=shift;

while (my $file=shift) { print $file. "\n"; my $exifTool = new Image::ExifTool; my $info = $exifTool->ImageInfo( $file );

my @date_fields=qw/ModifyDate DateTimeDigitized MetadataDate HistoryWhen CreateDate FileModifyDate/;

foreach my $f (keys %$info) { my $ok=0; foreach (@date_fields) { do { $ok=1; last } if $f=~/$_/; }	next unless $ok;

my $value=$info->{ $f }; $value=~/^\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}/ or next;

print $value. ' => ';

my $end=$';

$value=~s/[:\s]//g;

print my $date=UnixDate("epoch " . (UnixDate(ParseDateString($value), "%s") + $s*3600), "%Y:%m:%d %H:%M:%S"). $end; print "\n"; $exifTool->SetNewValue( $f, $date, Protected => 1 ); }

$exifTool->WriteInfo($file);

}

