Image::Libexif
NAME
Image::Libexif - High-level bindings to libexif
SYNOPSIS
use v6;
use Image::Libexif :tagnames;
use Image::Libexif::Constants;
sub MAIN($file! where { .IO.f // die "file $file not found" })
{
my Image::Libexif $e .= new: :$file;
my @tags := $e.alltags: :tagdesc;
say @tags».keys.flat.elems ~ ' tags found';
for ^EXIF_IFD_COUNT -> $group {
say "Group $group: " ~ «'Image info' 'Camera info' 'Shoot info' 'GPS info' 'Interoperability info'»[$group];
for %(@tags[$group]).kv -> $k, @v {
say "%tagnames{$k.Int}: @v[1] => @v[0]";
}
}
}
use v6;
use Concurrent::File::Find;
use Image::Libexif;
use Image::Libexif::Constants;
#| This program displays the EXIF date and time for every file in a directory tree
sub MAIN($dir where {.IO.d // die "$dir not found"})
{
my @files := find $dir, :extension('jpg'), :exclude-dir('thumbnails') :file, :!directory;
@files.race.map: -> $file {
my Image::Libexif $e .= new: :file($file);
try say "$file " ~ $e.lookup(EXIF_TAG_DATE_TIME_ORIGINAL); # don't die if no EXIF is present
$e.close;
}
}
DESCRIPTION
Image::Libexif provides an OO interface to libexif.
use Image::Libexif;
use Image::Libexif :tagnames;
If asked to import the additional symbol tagnames, Image::Libexif will make available the Hash %tagnames, which has tag numbers as keys and a short description as values.
new(Str :data?)
Creates an Image::Libexif object.
If the optional argument $file is provided, then it will be opened and read; if not provided during the initialization, the program may call the open method later. If the optional argument data is provided, then the object will be initialized from the provided data; if not provided during the initialization, the program may call the load method later.
open(Str $file!)
Opens a file and reads it into an initialiazed object (when no file or data has been provided during initialization).
load(Buf $data!)
Reads the data into an initialiazed object (when no file or data has been provided during initialization).
close
Closes the internal libexif object, frees the memory and cleans up.
info(--> Hash)
Gathers some info:
ordercode - the byte order as a code
orderstr - the byte order as a string
datatype - the data type
tagcount - the number of tags
lookup(Int group! --> Str)
lookup(Int $tag! --> Str)
Looks up a tag in a specific group or in all groups. A tag may be present in more than one group. Group names are available as constants:
IMAGE_INFO
CAMERA_INFO
SHOOT_INFO
GPS_INFO
INTEROPERABILITY_INFO
tags(Int tagdesc? --> Hash)
Delivers all the tags in a specific group into a hash; the keys are the tag numbers. If the tag description is requested, the hash values are presented as an array [value, tag description].
alltags(:$tagdesc? --> Array)
Delivers an array of hashes, one for each group. If the tag description is requested, the hash values are presented as an array [value, tag description].
notes(--> Array)
Reads the Maker Note data as an array of strings. Each string is a concatenation of the note description, name, title, and value.
method thumbnail(_ not found" } --> Blob)
sub thumbnail(_ not found" } --> Blob) is export(:thumbnail)
Returns the thumbnail found in the original file, if any, as a Blob. This functionality is available as a method and a sub, since the library doesn't really need a fully initialized exif object. To use the sub import it explicitly: use Image::Libexif :thumbnail;.
Errors
There one case when an error may be returned: trying to open a non-existent file. This can happen while initializing an object with .new() and calling the .open() method. In both cases the method will return a Failure object, which can be trapped and the exception can be analyzed and acted upon.
Prerequisites
This module requires the libexif library to be installed. Please follow the instructions below based on your platform:
Debian Linux
sudo apt-get install libexif12
The module looks for a library called libexif.so.
Installation
To install it using zef (a module management tool):
$ zef install Image::Libexif
Testing
To run the tests:
$ prove -e "perl6 -Ilib"
Author
Fernando Santagata
License
The Artistic License 2.0