Start · Sprachen · PHP · Referenz · exif_read_data

exif_read_data

Funktion

Liest die EXIF-Header (Metadaten) aus einer JPEG- oder TIFF-Bilddatei und gibt sie als assoziatives Array zurück.

seit PHP 4.2.0 Kategorie: io

Signatur

exif_read_data(string|resource $file, string|null $required_sections = null, bool $as_arrays = false, bool $read_thumbnail = false): array|false

Beschreibung

exif_read_data() liest die EXIF-Metadaten aus einer Bilddatei (JPEG oder TIFF) und gibt alle enthaltenen Informationen — wie Kameramodell, Aufnahmedatum, GPS-Koordinaten, Belichtungszeit und Bildausrichtung — als assoziatives Array zurück. Die Funktion ist besonders nützlich bei Fotogalerien, Upload-Pipelines oder Anwendungen, die Bilder nach Aufnahmeort oder -zeit sortieren.

Über den Parameter required_sections kann die Ausgabe auf bestimmte EXIF-Sektionen eingeschränkt werden, z. B. IFD0, EXIF, GPS oder THUMBNAIL. Mit as_arrays = true werden alle Werte einheitlich als Arrays zurückgegeben, was die Verarbeitung vereinfacht, wenn mehrere Werte pro Tag vorkommen können.

Die Funktion benötigt die aktivierte EXIF-Erweiterung (ext/exif), die seit PHP 7.2 standardmäßig gebündelt (aber nicht automatisch aktiviert) ist. Vor der Verwendung von GPS- oder Thumbnail-Daten empfiehlt sich eine Prüfung, ob die entsprechenden Schlüssel im Rückgabe-Array vorhanden sind.

Parameter

Name Typ Default Beschreibung
$file Pflicht string|resource Pfad zur Bilddatei (JPEG oder TIFF) als String oder ein geöffneter Stream-Resource-Handle. Remote-URLs werden unterstützt, wenn allow_url_fopen aktiviert ist.
$required_sections string|null null Kommagetrennte Liste der zu lesenden EXIF-Sektionen, z. B. 'IFD0,EXIF,GPS'. Ist eine Sektion nicht vorhanden, wird sie im Rückgabe-Array einfach ausgelassen. null liest alle verfügbaren Sektionen.
$as_arrays bool false Wenn true, werden alle Sektionen als verschachtelte Arrays zurückgegeben, auch wenn nur ein Wert vorhanden ist. Erleichtert konsistente Weiterverarbeitung.
$read_thumbnail bool false Wenn true, werden die rohen Thumbnail-Daten (falls vorhanden) in den Rückgabe-Array einbezogen. Diese Daten können direkt als Bilddaten ausgegeben werden.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein assoziatives Array mit den EXIF-Metadaten zurück. Die genauen Schlüssel hängen vom Inhalt der Datei ab. Gibt false zurück, wenn die Datei nicht gelesen werden kann, kein gültiges JPEG/TIFF ist oder die EXIF-Erweiterung nicht verfügbar ist.

Beispiele

Grundlegende EXIF-Daten eines Fotos auslesen

<?php
$file = 'foto.jpg';
$exif = exif_read_data($file);

if ($exif !== false) {
    echo 'Dateiname: ' . $exif['FileName'] . PHP_EOL;
    echo 'Aufnahmedatum: ' . ($exif['DateTimeOriginal'] ?? 'unbekannt') . PHP_EOL;
    echo 'Kamera: ' . ($exif['Model'] ?? 'unbekannt') . PHP_EOL;
    echo 'Bildbreite: ' . ($exif['COMPUTED']['Width'] ?? 'unbekannt') . ' px' . PHP_EOL;
} else {
    echo 'EXIF-Daten konnten nicht gelesen werden.';
}
Dateiname: foto.jpg Aufnahmedatum: 2023:08:15 10:34:21 Kamera: Canon EOS R5 Bildbreite: 6000 px

GPS-Koordinaten aus EXIF-Daten extrahieren

<?php
function exifGpsToDecimal(array $koordinate, string $ref): float {
    // Koordinaten liegen als Brüche vor, z.B. ['48/1', '7/1', '3456/100']
    $grad    = array_map(fn($v) => sscanf($v, '%d/%d'), $koordinate);
    $decimal = $grad[0][0] / $grad[0][1]
             + ($grad[1][0] / $grad[1][1]) / 60
             + ($grad[2][0] / $grad[2][1]) / 3600;
    return (in_array($ref, ['S', 'W'])) ? -$decimal : $decimal;
}

$exif = exif_read_data('foto.jpg', 'GPS');

if (!empty($exif['GPS']['GPSLatitude']) && !empty($exif['GPS']['GPSLongitude'])) {
    $lat = exifGpsToDecimal($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
    $lng = exifGpsToDecimal($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
    printf('Breitengrad: %.6f, Längengrad: %.6f%s', $lat, $lng, PHP_EOL);
} else {
    echo 'Keine GPS-Daten vorhanden.' . PHP_EOL;
}
Breitengrad: 48.137154, Längengrad: 11.576124

Bildausrichtung (Orientation) für automatische Drehung nutzen

<?php
$exif = exif_read_data('foto.jpg', 'IFD0');
$orientation = $exif['IFD0']['Orientation'] ?? 1;

$bild = imagecreatefromjpeg('foto.jpg');

$bild = match ($orientation) {
    3 => imagerotate($bild, 180, 0),
    6 => imagerotate($bild, -90, 0),
    8 => imagerotate($bild, 90, 0),
    default => $bild,
};

header('Content-Type: image/jpeg');
imagejpeg($bild);
imagedestroy($bild);

// Wichtig · Fallstricke

Sicherheitshinweis: EXIF-Daten werden vom Benutzer geliefert und können manipuliert sein. Vertraue niemals unkritisch dem Inhalt von EXIF-Feldern — filtere und validiere alle Werte, bevor du sie in Datenbanken speicherst oder an HTML ausgibst, um SQL-Injection und XSS zu vermeiden.

Datenschutz: GPS-Koordinaten und andere persönliche Metadaten (Gerätename, Seriennummer) können datenschutzrechtlich problematisch sein. Prüfe, ob du diese Daten beim Upload entfernen oder maskieren musst (z. B. mit exif_imagetype() + GD-Neuspeicherung).

Die Funktion unterstützt offiziell nur JPEG- und TIFF-Dateien. Bei anderen Dateitypen oder korrupten Dateien wird false zurückgegeben und ein PHP-Warning ausgelöst — fange dieses ggf. mit @exif_read_data() oder einem eigenen Error-Handler ab.

Ab PHP 7.2 gibt es bei ungültigen EXIF-Daten im Thumbnail-Bereich keine fatalen Fehler mehr, sondern lediglich Warnungen. Ältere PHP-Versionen können bei manipulierten Dateien abstürzen.