Anzeige
Tutorialbeschreibung

Funktion zur Auslese der Exifdaten eines Bildes schreiben

Funktion zur Auslese der Exifdaten eines Bildes schreiben

In diesem Tutorial erkläre ich anhand eines kurzen Beispiels, wie die Exif-Daten eines Bildes ausgelesen und verarbeitet werden können. Außerdem gehe ich noch auf die Integration der Funktion in Wordpress ein.


Da dies mein erstes Tutorial ist, wäre ich über Verbesserungsvorschläge und Kritik sehr erfreut ;).


Schritt 1

Bevor wir beginnen können, brauchen wir erst einmal ein Bild mit EXIF-Daten. Dazu habe ich mir meine DSLR zu Hilfe genommen, mit dieser ein Bild gemacht und dieses anschließend in LR in ein JPG umgewandelt.

Falls ihr gerade keine Kamera zur Hand habt, könnt ihr zum Üben auch einfach das Bild aus der Arbeitsdatei nutzen.

BeispielbildBilder



 
Nachdem wir nun ein Test-Bild haben, können wir anfangen. Dazu legen wir uns erst einmal ein PHP-Dokument (im Folgenden index.php genannt) an, in das wir unser HTML-Grundgerüst schreiben:

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="utf-8">
  <title>Exifdaten eines Bildes auslesen</title>
</head>
<body>
  <figure>
    <img src="images/IMG_5261.jpg" alt="IMG_5261" width="" height="" />
  </figure>
  <div>
    <h2>Ausgewählte Exifs:</h2>
  </div>
  <div>
    <h2>Alle Exifs:</h2>
  </div>
</body>
</html>

Wie anhand des Codes zu sehen ist, werden wir gleich zum einen alle EXIF-Daten des Bildes ausgeben und zum anderen ein paar ausgewählte, die wir genauer betrachten wollen.


Schritt 2

Beginnen wir mit der eigentlichen Funktion; dazu legen wir ein neues PHP-Dokument mit dem Namen "functions.php" an.
Dieses binden wir mittels
<?php include('functions.php'); ?>

in der ersten Zeile unserer index.php ein.

Danach legen wir uns die Funktion zur Ausgabe aller EXIF-Daten an. Diese dient eigentlich nur der Findung der EXIF-Bezeichnungen und kann im Anschluss wieder gelöscht werden.

Dazu öffnen wir die functions.php und legen dort die Funktion an:
<?php
  function alle_exif_ausgeben($image){
    if($image!=''){
      $data = exif_read_data($image, 0 , true);
      foreach ($data as $key => $section) {
        foreach ($section as $name => $val) {
          echo "$key.$name: $val<br/>\n";
        }
      }
    }
  }
?>

In Zeile 2 überprüfen wir mit der If-Bedingung, ob der Funktion der Pfad ($image) des Bildes übergeben wurde. Falls dies nicht der Fall ist, passiert nichts.

In Zeile 3 lesen wir alle EXIF-Daten des Bildes aus. Diese werden in einem Array $data abgelegt.

"exif_read_data" ist folgendermaßen definiert:
array exif_read_data ( string $filename [, string $sections [, bool $arrays [, bool $thumbnail ]]] )

In den for-Schleifen geben wir die Daten sortiert aus.


 

Schritt 3

Um das Ganze zu testen, rufen wir die Funktion in unserer index.php auf:
<?php alle_exif_ausgeben('images/IMG_5261.jpg');?>

Hier ein exemplarischer Ausschnitt des Ergebnisses:
IFD0.Copyright: © Andre Kind
EXIF.ExposureTime: 1/800
EXIF.FNumber: 18/10
EXIF.ExposureProgram: 3
EXIF.ISOSpeedRatings: 200
EXIF.DateTimeOriginal: 2012:03:28 10:05:48

Jetzt können wir uns aus der langen Liste der ausgelesenen EXIF-Daten die raussuchen, die wir weiter verwenden wollen. In diesem Tutorial wären dies beispielhaft:

Aufnahmedatum, -zeit, Blende, Belichtungsdauer


Schritt 4

Um diese Werte einzeln auszugeben, schreiben wir uns eine extra Funktion in unserer functions.php:

Vom Grundgerüst sieht diese wieder so aus wie unsere erste Funktion:
function attachment_exif($image){
  if($image!=''){
    $data = exif_read_data($image, 0 , true); /*Auslesen der Daten*/
    [...]
  }
}

Diesmal werden aber nicht alle Werte mit den for-Schleifen ausgegeben, denn wir wollen ja nur die oben ausgewählten. Anhand unserer Ausgabe der ersten Funktion schauen wir, welchen Wert wir brauchen.

Für das/die Aufnahmedatum/-zeit brauchen wir also: EXIF.DateTimeOriginal

Diesen Wert bekommen wir, indem wir in unserem Array die Stelle ["EXIF"]["DateTimeOriginal"] ansprechen.

 
Da wir Datum und Zeit getrennt voneinander ausgeben wollen, müssen wir diesen Wert noch aufteilen und können ihn anschließend ausgeben:
[...]
    /*Verarbeitung Datum+Zeit*/
    if(isset($data["EXIF"]["DateTimeOriginal"])){
      $date = str_replace(":","-",substr($data["EXIF"]["DateTimeOriginal"], 0, 10));
      $time = substr($data["EXIF"]["DateTimeOriginal"], 10);
      echo('Datum: '.$date.'<br />');
      echo('Zeit: '.$time.'<br />');
    }
[...]

Wir überprüfen hier zuerst, ob der Wert vorhanden ist (if(isset([...]))) und teilen ihn anschließend nach 10 Zeichen in Datum und Uhrzeit auf (substr). Außerdem wird noch der Doppelpunkt des Datums durch ein "-" ersetzt (str_replace).

Kommen wir nun zur eingestellten Blende. Hier müssen wir den Wert EXIF.FNumber ansprechen:
[...]
    /*Verarbeitung Blende*/
    if(isset($data["EXIF"]["FNumber"])){
      list($zaehler, $nenner) = explode("/",$data["EXIF"]["FNumber"]);
      echo('Blende: f/'.($zaehler/$nenner).'<br />');
    }
[...]

Damit wir keinen Bruch angezeigt bekommen, sondern eine Dezimalzahl, müssen wir den Wert erst mit explode aufteilen und anschließend mit ($zaehler/$nenner) verrechnen.

Die Belichtungszeit bedarf hier ein wenig mehr Pflege:
[...]
    /*Verarbeitung Belichtungsdauer*/
    if(isset($data["EXIF"]["ExposureTime"])){
      list($zaehler, $nenner) = explode("/", $data["EXIF"]["ExposureTime"]);
      if ($zaehler > $nenner) {
        echo('Belichtungsdauer: '.$zaehler.'s<br />');
      } else {
        $nenner = round($nenner/$zaehler);
        echo('Belichtungsdauer: 1/'.$nenner.'s<br />');
      }
    }
[...]

Hier wird unterschieden, ob unter einer Sekunde (1/x) belichtet wurde oder über einer Sekunde (x). Das Prinzip ist jedoch das gleiche wie schon bei der Blende.

 
Das Ganze kann nun für alle der vorliegenden Daten gemacht werden. Wenn man z.B. noch das Kameramodell mit ausgeben möchte, kann man das, indem man den Wert $data["IFD0"]["Model"] anspricht.


Schritt 5

Kommen wir zum letzten Teil des Tutorials, der Integration der Funktion in ein WordPress-Theme. Dazu kopieren wir unsere Funktion aus der functions.php in die functions.php des aktivierten WordPress-Themes.

Die functions.php findet ihr in der Regel hier: "/wp-content/themes/ordner-des-themes/functions.php" Falls dort keine vorzufinden ist, legt man einfach eine an.

Um die Daten in eurem Theme aufrufen zu können, müsst ihr die Funktion an der gewünschten Stelle aufrufen - hier beispielhaft in der attachment.php:

<?php
  $image = wp_get_attachment_image_src ( get_post_thumbnail_id ( $post->ID ), '' ) ;
  attachment_exif($image[0]);
?>


Mit wp_get_attachment_image_src ( get_post_thumbnail_id ( $post->ID ), '' ) ; liest man den Pfad sowie Höhe und Breite des Attachments aus.

Der erste Wert des Rückgabewertes, also hier $image[0], ist dabei der Pfad.

Ich hoffe, das Tutorial ist verständlich ;) und kann euch weiterhelfen.

 

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von schraubergott
  • 14.04.2013 - 18:51

Danke für das Tutorial, lohnenswert zu lesen

Portrait von unofactura
  • 26.05.2012 - 10:57

Prima Sache, werde ich gleich mal probieren.

Portrait von Williwanderschuh
  • 25.05.2012 - 16:47

Nett, aber für Anfänger leider unbrauchbar.
Servus

Portrait von WobIntosh
  • 25.05.2012 - 15:59

Cool, versuche ich bei Gelegenheit mal!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 25.05.2012 - 15:19

mh... okay, mal versuchen ob es klappt :)
Danke für deine Mühe, aber füge vielleicht in deiner PDF noch Schritt zwei und drei hinzu ;)

Portrait von Stefan
  • 25.05.2012 - 15:28

Oh ok, wurde korrigiert.

Portrait von vincitore
  • 25.05.2012 - 15:30

hatte mich gerade schon gewundert, warum bei mir alles mit drin ist ;) danke für die schnelle Korrektur!

x
×
×