Skip to content

Latest commit

 

History

History
139 lines (100 loc) · 4.35 KB

Tutorial.rdoc

File metadata and controls

139 lines (100 loc) · 4.35 KB

Mini Tutorial

Installation

Lesson 1: Reading Meta Data

A Simple Example

require 'rubygems'
require 'mini_exiftool'

photo = MiniExiftool.new 'photo.jpg'
puts photo['DateTimeOriginal']

Smart Tag Names

In the example above we use photo['DateTimeOriginal'] to get the value for the time the photo was taken. But tag names are not case sensitive and additional underlines are also irrelevant. So following expressions are equivalent:

photo['DateTimeOriginal']
photo['datetimeoriginal']
photo['date_time_original']

It is also possible to use symbols:

photo[:DateTimeOriginal]
photo[:datetimeoriginal]
photo[:date_time_original]

Nicer Access Via Dynamic Methods

Using the []-method is the safest way to access to values of tags (e. g. Self-timer you can only access this way) but the smarter way is using dynamic method access. You can write:

photo.datetimeoriginal

or also

photo.date_time_original

Value Types

Following types of values are at the moment supported:

  • Array (e. g. Keywords => [‘tree’, ‘gras’])

  • Fixnum (e. g. ISO => 400)

  • Float (e. g. FNumber => 9.5)

  • String (e. g. Model => DYNAX 7D)

  • Time (e. g. DateTimeOriginal => 2005:09:13 20:08:50)

Be aware, if there is only one value in a tag which can hold multiple values the result is’nt an array! But you can get one with the Array method:

# only _one_ keyword
p1 = MiniExiftool.new 'p1.jpg'
p1.keywords # => 'red'
# _more than one_ keywords
p3 = MiniExiftool.new 'p3.jpg'
p3.keywords # => ['red', 'yellow', 'green']

# if we want to get an array in both cases and don't know
# if there is one ore more values set let's take Array()
Array(p1.keywords) # => ['red']
Array(p3.keywords) # => ['red', 'yellow', 'green']

The Exiftool command-line application has an option (-n) to get values as numbers if possible, in MiniExiftool you can do this with setting the :numerical option to true while generating a new instance with new or using the numerical=-method combining with calling reload.

Let’s look at an example:

# standard: numerical is false
photo = MiniExiftool.new 'photo.jpg'
photo.exposure_time # => '1/60' (String)
# now with numerical is true
photo.numerical = true
photo.reload
photo.exposure_time # => 0.01666667 (Float)

This behaviour can be useful if you want to do calculations on the value, if you only want to show the value the standard behaviour is maybe better.

The Time class of Ruby cannot handle timestamps before 1st January 1970 on some platforms. If there are timestamps in files before this date it will result in an error. In this case we can set the option :timestamps to DateTime to use DateTime objects instead of Time objects.

There is another option :composite. If this is set to false the composite tags are not calculated by the exiftool command-line application (option -e).

Further Example

For understanding reading access to meta data also have a look at the example file print_portraits.rb in the examples directory.

Lesson 2: Writing Meta Data

Also A Very Simple Example

require 'rubygems'
require 'mini_exiftool'

photo = MiniExiftool.new 'photo.jpg'
photo.comment = 'hello world'
photo.save

Save Is Atomar

If you have changed serval values and call the save-method either all changes will be written to the file or nothing. The return value of the save-method is true if all values are written to the file otherwise save returns false. In the last case you can use the errors-method which returns a hash of the tags which values couldn’t be writed with an error message for each of them.

Interesting Methods

Have a look at the changed?-method for checking if the value of a specific tag is changed or a changing in general is done. In the same way the revert-method reverts the value of a specific tag or in general all changes.

You should also look at the rdoc information of MiniExiftool.

Further Examples

See external_photo.rb, print_portraits.rb and shift_time.rb in the examples directory.