Exif und C#: Wege um an die GPS-Metadaten aus Bildern zu kommen
Das Auslesen von Exif-Metadaten aus JPEG-Bildern ist für zahlreiche Anwendungsgebiete sehr interessant. Anhand der GPS-Dateien kann man so beispielsweise seine Sammlung nach Aufnahmeort gruppieren oder alle Fotos finden, die mit einer bestimmten Kamera gemacht wurden.
In Ruby ist das Auslesen der Exif-Informationen dank Exifr sehr einfach. Für C# fehlt ein klarer Favorit, was zahlreiche kleine und wenig verwendete Bibliotheken hervorbrachte. Während solche Konkurrenzsituationen sonst zu einem belebten Markt führen, ist es in C# eher eine Spirale nach unten: Noch weniger Funktionalität und noch weniger Dokumentation – so jedenfalls scheint es bei einem Blick auf die Suchresultate in NuGet.
Exif-Informationen mit den Bordmittel von .Net auslesen
Über die Klasse Bitmap aus System.Drawing kann man sich über die PropertyItems zu den Exif-Informationen vorarbeiten. Dies ist gut geeignet um eine Liste aller gesetzten Exif-Felder zu erhalten. Möchte man aber auch die Inhalte habe, so wird es sehr mühsam. Um beispielsweise die GPS-Koordinaten auszulesen, gilt es diese Herausforderungen zu lösen:
- Typen-Nummer der Felder für den Längen- und Breitengrad finden
- Typen-Nummer für die Richtung des Längen- und Breitengrades finden (Nord/Süd, Ost/West)
- Felder extrahieren
- Inhalt der Felder korrekt konvertieren
- Anhand der Richtung die Koordinaten korrekt umrechnen
Nach langer Suche, einigen Fehlschlägen und viel kopiertem Code bin ich bei diesen 2 Methoden angekommen:
Während dieser Ansatz nun die GPS-Koordinaten liefert, fehlen mir für alle anderen Felder eine vergleichbare Konvertierung. Dieses mühsame abringen der Feldinhalte dürfte wohl für so mache verlassene Exif-Bibliothek in C# verantwortlich sei.
Auslesen mit Exif.Net
Exif.Net von William Hemmingsson ist erfreulich gut dokumentiert. Man findet alles was man zum Starten braucht direkt in der Readme-Datei. Leider ist man auch sehr schnell an den Grenzen dieser Bibliothek angekommen. So gibt es zwar zahlreiche Felder für Angaben zur Aufnahmeart, der Auflösung oder zum Blitz, allerdings nichts zu den GPS-Informationen.
Der Code zum Auslesen des Kamera-Modells ist dafür sehr einfach:
Aktuell ist der Einsatzbereich von Exif.Net daher sehr beschränkt. Mit genug Zeit, Geduld und Wissen könnte man die zahlreichen Erweiterungspunkte von Exif.Net nutzen und die fehlenden Felder selber ergänzen.
Auslesen mit ExifLib
Das Projekt ExifLib von Simon McKenzie ist da schon deutlich praktikabler. Die Exif-Felder sind als enum abgelegt, wodurch man die gewünschten Felder sehr einfach abrufen kann. Bei den GPS-Koordinaten muss man sich allerdings selber um die Umrechnung kümmern:
Falls man Koordinaten ohne Angabe der Himmelsrichtung ausgeben will, braucht es noch diesen Code:
Damit wird aus einem 110.1116467 West
die für Kartenanwendungen eher gebräuchlichen -110.1116467
.
Auslesen mit MetadataExtractor
MetadataExtractor wird von Drew Noakes gepflegt und bietet wohl den grössten Funktionsumfang zum Extrahieren von Metadaten. Für GPS-Informationen steht nicht nur die dezimale Repräsentation zur Verfügung (36.98276 -110.111646666667
), sondern auch die sexagesimale Notation mit Grad und Bogenminuten (36° 58' 57.94" -110° 6' 41.93"
). Der notwendige Code zum Auslesen der GPS-Koordinaten ist im Vergleich zu den anderen Bibliotheken an Einfachheit kaum zu übertreffen:
Code Beispiele
Wer selber ein wenig mit diesen Code-Beispielen arbeiten möchte, findet diese als Visual-Studio Projekt auf GitHub.
Fazit
Wer mit C# Exif-Metadaten auslesen will, steht vor einem kleinen Abenteuer. Je nach gewünschten Feldern ist die eine oder andere Bibliothek besser. Für meine Anforderungen ist MetadataExtractor aktuell am besten geeignet und empfiehlt sich angesichts der Breite der unterstützten Felder, als Startpunkt für die eigenen Abklärungen.