Exif Informationen auslesen leicht gemacht

Ich wollte vor kurzem wissen welche meiner Ferienfotos über GPS-Informationen verfügen. Meine Kamera speichert mit den Bildern sehr viele Metadaten ab, darunter auch der Standort an dem ein Foto aufgenommen wurde. Diese Metadaten werden im Exif-Format in den Header des jeweiligen Bildes gespeichert.

Jeder bessere Bildbetrachter erlaubt einem diese Informationen abzurufen. Allerdings nur Bild für Bild, was bei einer grösseren Menge nicht wirklich praktikabel ist. Es musste also eine andere Lösung her.

 

Ein Ansatz mit Ruby

Eine kurze Suche genügte um ein Gem fürs Auslesen von Exif-Informationen zu finden. Exifr liefert all die von mir benötigten Informationen und verfügt erst noch über eine sehr einfache API. Die Installation geht wie üblich über RubyGems:

gem install exifr

Um meine Bilder auszulesen benötigte ich nun nur noch ein kleines Script rund um den Aufruf von Exifr. Dieses Script sollte über alle übergebenen Dateien iterieren und im Falle eines JPEG-Bildes die GPS-Informationen herauslesen. Der dazu notwendige Code fiel sehr einfach aus:

#!/usr/bin/ruby
# encoding: utf-8

require 'exifr'

ARGV.each {|arg|
  next unless arg.downcase.end_with? "jpg"
           
  exif =  EXIFR::JPEG.new(arg)
  if(exif.gps)
    puts "%s [%s %s]" % [arg, exif.gps.latitude, exif.gps.longitude]
  else
    puts "%s no GPS info" % arg
  end
}

Ein Aufruf des Scripts genügt die von mir benötigte Auflistung zu erhalten:

$ ./extract_gpsinfo.rb IMAGES/USA_2012_00_0*
IMAGES/USA_2012_00_01.jpg no GPS info
IMAGES/USA_2012_00_02.JPG [21.548169166666668 -158.24109055555556]
IMAGES/USA_2012_00_03.JPG [36.51571472222222 -111.59166611111112]
IMAGES/USA_2012_00_04.JPG [39.81834583333334 -77.23305416666666]
IMAGES/USA_2012_00_05.JPG no GPS info

 

Ausbaumöglichkeiten

Mir gefällt an diesem Ansatz mit wie wenig Aufwand auch andere Felder ausgelesen werden können. Um Beispielsweise das Aufnahmedatum der Bilder auszugeben genügt diese Erweiterung:

ARGV.each {|arg|
  next unless arg.downcase.end_with? "jpg"
           
  exif =  EXIFR::JPEG.new(arg)
  puts "%s %s" % [arg, exif.date_time_original]
}
./extract_gpsinfo.rb IMAGES/USA_2012_00_0*
IMAGES/USA_2012_00_01.jpg 
IMAGES/USA_2012_00_02.JPG 2012-05-17 00:29:52 +0200
IMAGES/USA_2012_00_03.JPG 2012-05-25 17:37:10 +0200
IMAGES/USA_2012_00_04.JPG 2012-06-06 12:17:03 +0200
IMAGES/USA_2012_00_05.JPG 2012-06-25 12:43:44 +0200

 

Fazit

Exifr macht es einem sehr einfach um mit Ruby Exif-Informationen aus Bildern auszulesen. Für meinen Einsatzzweck fand ich mit diesem Gem eine sehr einfache und gut funktionierende Lösung.