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 )