You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

84 lines
3.6 KiB

#------------------------------------------------------------------------------
# File: age.config
#
# Description: Definition for a Composite "Age" tag to calculate age of person
# in image based on their birthday and the DateTimeOriginal or
# CreateDate of the image.
#
# Notes: The birthday date is set via the -userParam option, and is a
# string containing year, month, day, hour, minute and second.
# Only the year is required. By default the format of the
# returned Age value is exactly the same as the input birthday,
# with 2 digits for each parameter, however an AgeFormat user
# parameter may be used to define a printf-style format string
# for any desired output format (see fourth example below).
#
# If the specified birthday comes after the image date/time
# then the returned result is enclosed in brackets to indicate
# a negative time difference (see last example below).
#
# If birthday is not given, then the current date/time is assumed
# (in which case Age returns the age of the photo).
#
# Examples: (based on a DateTimeOriginal of "2005:08:27 18:21:00")
#
# > exiftool -config age.config -userparam birthday=1990:09:31 -age a.jpg
# Age : 14:10:26
#
# > exiftool -config age.config -userparam birthday=1990Y09M31D -age a.jpg
# Age : 14Y10M26D
#
# > exiftool -config age.config -userparam birthday="2000:01:02 03:45" -age a.jpg
# Age : 05:07:25 14:36
#
# > exiftool -config age.config -userparam birthday=2000:01:02 \
# -userparam ageformat="%d years" -age a.jpg
# Age : 5 years
#
# > exiftool -config age.config -userparam birthday=2005:09:26 -age a.jpg
# Age : (00:00:30)
#
# Requires: ExifTool version 9.90 or later
#
# Revisions: 2017/01/24 - P. Harvey Created
#------------------------------------------------------------------------------
%Image::ExifTool::UserDefined = (
'Image::ExifTool::Composite' => {
Age => {
Desire => {
0 => 'DateTimeOriginal',
1 => 'CreateDate',
},
ValueConv => q{
my $bday = $self->Options(UserParam => 'Birthday');
$bday or ($bday = TimeNow()) =~ s/[-+].*//;
my $date = $val[0] || $val[1] or return undef;
my @t0 = ($bday =~ /\d+/g);
my @t1 = ($date =~ /\d+/g);
return '<invalid birthday date>' unless $t0[0];
my ($i, @diff, $sign);
for ($i=0; $i<6; ++$i) {
last unless defined $t0[$i];
my $dt = $t1[$i] - $t0[$i];
$sign or $sign = ($dt <=> 0);
push @diff, $dt * $sign;
}
require 'Image/ExifTool/Shift.pl';
my $base = $sign < 0 ? \@t1 : \@t0;
my @wrap = (0, 12, DaysInMonth($$base[1]||1,$$base[0]), 24, 60, 60);
for ($i=$#diff; $i>0; --$i) {
$diff[$i] < 0 and $diff[$i] += $wrap[$i], --$diff[$i-1];
}
$bday =~ s/\d+/sprintf '%.2d', shift @diff/ge;
return $sign < 0 ? "($bday)" : $bday;
},
PrintConv => q{
my $fmt = $self->Options(UserParam => 'AgeFormat') or return $val;
sprintf($fmt, $val =~ /\d+/g);
},
},
},
);
1; #end