exif-Daten mit PHP auslesen

13.06.2013

Wer Fotos mit seiner Digitalkamera oder auch seinen Smartphone gemacht hat, möchte unter Umständen nicht nur das Foto selbst veröffentlichen, sondern auch die Metadaten der Bilder mit anzeigen lassen. Bei Google+ ist dies beispielsweise der Fall. Um dies auf eigenen Seiten ebenfalls zu können, bietet PHP bereits eine Erweiterung zum Auslesen der EXIF-Daten an. Die Exif-Erweiterung muss u. U. noch in der php.ini aktiviert werden, indem die php_exif.so bzw. php_exif.dll bei den Extensions eingetragen bzw. die Auskommentierung entfernt wird. Die Bibliothek wird standardmäßig mit PHP ausgeliefert und muss nicht separat heruntergeladen werden. Die offizielle Dokumentation zur Exif-Erweiterung ist auf http://php.net/manual/de/book.exif.php nachzulesen.

Das Auslesen der Informationen ist dabei recht einfach: 

<?php
$exif = exif_read_data('bilder/bilddatei.jpg', 0, false);
foreach ($exif as $key => $value) {
echo "<strong>".$key.":</strong> ".$value."<br />";
}
?>

Ein sehr vereinfachtes Beispiel, bei welchem ich auf verschaltete Arrays verzichte, indem ich als dritten Parameter false übergeben habe. Ansonsten gibt es auf http://www.php.net/manual/de/function.exif-read-data.php auch ein anderes Code-Beispiel. Für meine Zwecke reicht obiger Aufruf.

Relevante Werte, die das Array zurückgibt, sind unter anderem ExposureTime (Belichtungszeit), FNumber (Blende), ISOSpeedRatings (ISO-Wert), FocalLength (Brennweite) ud vielleicht auch MeteringMode (Messmodus). Eine nützliche Seite, um alle Exif-Tags zuordnen zu können, ist http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html

In meinem Fall waren zudem noch einige Änderungen notwendig. Beispielsweise gefiel mir die Anzeige der Belichtungszeit nicht. Anstelle von 3 Sekunden hatte ich dort 3000/1000 als Wert. Schließlich ist mein Script etwas gewachsen:

<?php
$exif = exif_read_data('bilder/bilddatei.jpg', 0, false);
foreach ($exif as $key => $value) {
switch ($key) {
case 'ExposureTime':
echo "<strong>Belichtungszeit</strong>";
$secArr = explode("/", $value);
$time = $secArr[0] / $secArr[1];
if ($time > 1) {
$value = $time . " Sekunden";
} else {
$value = $secArr[0] / 10 . "/" . $secArr[1] / 10 . " Sekunde";
}
echo $value."<br />";
break;

case 'FNumber':
echo "<strong>Blende</strong>";
$fnArr = explode("/", $value);
$fn = $fnArr[0] / $fnArr[1];
$value = "F/" . $fn;
echo $value."<br />";
break;

default:
echo "<strong>".$key.": </strong> ".$value."<br />";
break;
}
}
?>

Anstelle einer direkten Ausgabe als echo ist es natürlich sinnvoller, die Werte in einem Objekt oder Array zu halten und später darauf zurückzugreifen. Da die Galerie auf dieser Seite noch neu entwickelt wird, gibt es derzeit noch keine Demo. Die folgt dann zusammen mit aktuellen Fotos aus letztem und diesen Jahr bei den Einzelansichten der Bilder.