Album
view release on metacpan or search on metacpan
script/album view on Meta::CPAN
FNumber Flash FocalLength FocalLengthIn35mmFormat
FocusMode ISOSpeedRatings
ImageDescription Make Model
MeteringMode SceneCaptureType Orientation
CreateDate MediaCreateDate TimeZone
WhiteBalance
height width file_ext);
$exif_rot = { top_left => [ 0, '' ], # 1: no corr. needed
top_right => [ 0, 'v' ], # 2: flop (V)
bot_right => [ 180, '' ], # 3: 180
bot_left => [ 0, 'h' ], # 4: flip (H)
left_top => [ 90, 'h' ], # 5: flip 90
right_top => [ 90, '' ], # 6: 90
right_bot => [ 90, 'v' ], # 7: flop 90
left_bot => [ 270, '' ], # 8: 270
'Rotate 270 CW' => [ 270, '' ], # 270 CW = 90 CCW
'Rotate 180' => [ 180, '' ], # 180 CW = 180 CCW
'Rotate 90 CW' => [ 90, '' ], # 90 CW = 270 CCW
};
}
my $largepat;
sub basename_nolarge {
my ($f) = @_;
unless ( $largepat ) {
$largepat = quotemeta(::d_large());
$largepat = qr;^$largepat[/\\];;
}
$f =~ s;$largepat;;;
$f;
}
sub new {
my ($pkg, $file) = @_;
$pkg = ref($pkg) if ref($pkg);
my $self = { $file ?
(orig_name => $file,
dest_name => basename_nolarge($file)) : (),
description => "",
annotation => [],
tag => "",
hidden => 0,
};
if ( $file && -f $file ) {
my @st = stat(_);
my $ii = ::cache_entry($file);
if ( $ii ){
$self = $ii;
delete($self->{$_}) foreach grep { /^_/ } keys(%$self);
}
# Else, get image info.
else {
# my $ii = Image::Info::image_info($file);
my $ii = Image::ExifTool->new->ImageInfo($file);
$self->{file_size} = $st[7];
$self->{timestamp} = $st[9];
unless ( exists($ii->{error}) ) {
for my $key ( @exif_fields ) {
my $val = $ii->{$key};
next unless defined $val;
if ( $key eq "Orientation" ) {
($self->{rotation}, $self->{mirror}) =
@{$exif_rot->{$val}}
if exists $exif_rot->{$val};
}
else {
$val = $val->as_float
if UNIVERSAL::can($val,"as_float");
$self->{$key} = $val;
}
}
::cache_entry($file, $self);
}
}
# Actualize.
$self->{file_size} = $st[7];
$self->{timestamp} = $st[9];
}
bless($self, $pkg);
}
INIT {
no strict 'refs';
for my $sub ( @std_fields, @exif_fields ) {
$sub = "_".$sub if $sub eq "rotation";
*{"ImageInfo::$sub"} = sub {
my ($self, $value) = @_;
$self->{$sub} = $value if defined($value);
$self->{$sub};
};
}
}
sub xDateTime {
my ( $self ) = @_;
my $skew = $skew;
my $dt = $self->DateTimeOriginal || $self->CreateDate || $self->MediaCreateDate || $self->DateTime;
if ( $self->TimeZone ) {
my ( $m, $h, $min ) = $self->TimeZone =~ /^([-+])(\d+):(\d+)/;
$min += 60 * $h;
$min = -$min if $m eq "-";
$skew += $min * 60;
}
return ($dt) unless $skew;
my $fd = $dt || "";
if ( $fd =~ /(\d\d\d\d):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)/ && $2 != 0) {
use Time::Local;
my $time = timelocal($6,$5,$4,$3,$2-1,$1)+$skew;
my @t = localtime($time);
$dt = sprintf("%04d:%02d:%02d %02d:%02d:%02d",
1900+$t[5], 1+$t[4], $t[3],
$t[2], $t[1], $t[0]);
return $dt;
}
( run in 0.497 second using v1.01-cache-2.11-cpan-f03e8824b8d )