exif_read_data
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
exif_read_data — Liest die EXIF-Header einer Bilddatei aus
Beschreibung
exif_read_data(
resource|string $file
,
?string $required_sections
= null
,
bool $as_arrays
= false
,
bool $read_thumbnail
= false
): array|false
EXIF-Header kommen normalerweise bei JPEG/TIFF-Bildern
vor, die von Digitalkameras gemacht wurden. Leider hat jeder
Kamerahersteller eine andere Vorstellung davon, wie man die Bilder
beschreibt, sodass man sich nicht darauf verlassen kann, das ein bestimmter
Exif-Header vorhanden ist.
Height
und Width
werden genauso wie
getimagesize() berechnet. Diese Werte dürfen also nicht
Teil von irgendwelchen Headern sein, die zurückgegeben werden. Ferner ist
html
ein Höhen/Breiten-Textstring für den Gebrauch in
normalem HTML.
Wenn ein Exif-Header einen Copyrightvermerk beinhaltet, kann dieser selbst
aus zwei Werten bestehen. Da die Lösung im Exif-2.10 -Standard nicht
konsistent ist, liefert der COMPUTED
-Bereich die beiden
Einträge Copyright.Photographer
und
Copyright.Editor
, während die
IFD
-Bereiche aus einem Byte-Array besteht, in dem die
beiden Werte durch ein NULL-Zeichen getrennt sind. Wenn der Datentyp falsch
ist, ist nur der erste Eintrag vorhanden (normales Verhalten von Exif).
COMPUTED
beinhaltet auch einen
Copyright
-Eintrag. Dieser entspricht entweder dem
originalen Copyright-String oder er besteht aus einer kommaseparierten
Liste von Foto- und Herausgeber-Copyright.
Der Tag UserComment
hat das gleiche Problem, wie das
Copyright-Tag. Er kann zwei Werte speichern. Als erstes die verwendete
Kodierung und als zweites den Wert selbst. Wenn dem so ist, enthält der
IFD
-Bereich nur die Kodierung oder ein Byte-Array. Der
COMPUTED
-Bereich speichert beide in den Einträgen
UserCommentEncoding
und UserComment
.
Der Eintrag UserComment
ist in beiden Fällen verfügbar.
Er sollte also dem Eintrag im IFD0
-Bereich vorgezogen
werden.
exif_read_data() validiert auch EXIF-Datentags
entsprechend der EXIF-Spezifikationen
(» http://exif.org/Exif2-2.PDF, Seite 20).
Parameter-Liste
-
file
-
Der Ort der Bilddatei. Dies kann entweder der Pfad der Datei
(Stream-Wrapper werden wie üblich ebenso unterstützt) oder eine
Stream-Ressource sein.
-
required_sections
-
Ist eine kommaseparierte Liste von Bereichen, die in der Datei
vorhanden sein müssen, um das Rückgabe-Array zu
erzeugen. Wenn keiner der geforderten Bereiche gefunden werden kann,
wird false
zurückgegeben.
-
as_arrays
-
Definiert ob jeder Bereich ein Array wird oder nicht. Die
required_sections
COMPUTED
,
THUMBNAIL
und COMMENT
werden
immer zu Arrays, da die Namen der Werte mit denen anderer Bereiche
kollidieren können.
-
read_thumbnail
-
Bei true
wird das Miniaturbild ausgelesen, ansonsten nur die Daten
der Tags.
Rückgabewerte
Gibt ein assoziatives Array zurück, bei dem der Arrayindex
den Headernamen entspricht und der Arraywert die Werte enthält, die mit
diesen Headern in Verbindung stehen. Wenn keine Daten zurückgegeben werden
können, gibt exif_read_data() false
zurück.
Fehler/Exceptions
Fehler der Stufe E_WARNING
und/oder
E_NOTICE
können bei nicht unterstützten Tags oder
anderen potentiellen Fehlerbedingungen ausgelöst werden, aber die Funktion
versucht trotzdem, alle verständlichen Informationen zu lesen.
Beispiele
Beispiel #1 exif_read_data()-Beispiel
<?php
echo "test1.jpg:<br />\n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo $exif===false ? "Keine Headerdaten gefunden.<br />\n" : "Bild beinhaltet Header<br />\n";
$exif = exif_read_data('tests/test2.jpg', 0, true);
echo "test2.jpg:<br />\n";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />\n";
}
}
?>
Der erste Aufruf schlägt fehl, da das Bild keine Headerinformationen
enthält.
Das oben gezeigte Beispiel erzeugt
eine ähnliche Ausgabe wie:
test1.jpg:
Keine Headerdaten gefunden.
test2.jpg:
FILE.FileName: test2.jpg
FILE.FileDateTime: 1017666176
FILE.FileSize: 1240
FILE.FileType: 2
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT
COMPUTED.html: width="1" height="1"
COMPUTED.Height: 1
COMPUTED.Width: 1
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 1
COMPUTED.UserComment: Exif test image.
COMPUTED.UserCommentEncoding: ASCII
COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.
COMPUTED.Copyright.Photographer: Photo (c) M.Boerger
COMPUTED.Copyright.Editor: Edited by M.Boerger.
IFD0.Copyright: Photo (c) M.Boerger
IFD0.UserComment: ASCII
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.JPEGInterchangeFormatLength: 523
COMMENT.0: Comment #1.
COMMENT.1: Comment #2.
COMMENT.2: Comment #3end
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.Thumbnail.Height: 1
THUMBNAIL.Thumbnail.Height: 1
Beispiel #2 exif_read_data() mit Streams; verfügbar von PHP 7.2.0 an
<?php
// Öffne die Datei im Binärmodus
$fp = fopen('/path/to/image.jpg', 'rb');
if (!$fp) {
echo 'Fehler: Konnte das Bild nicht fürs Lesen öffnen';
exit;
}
// Versuche die Exif-Header zu lesen
$headers = exif_read_data($fp);
if (!$headers) {
echo 'Fehler: Konnte die Exif-Header nicht lesen';
exit;
}
// Gib die 'COMPUTED'-Header aus
echo 'EXIF Header:' . PHP_EOL;
foreach ($headers['COMPUTED'] as $header => $value) {
printf(' %s => %s%s', $header, $value, PHP_EOL);
}
?>
Das oben gezeigte Beispiel erzeugt
eine ähnliche Ausgabe wie:
EXIF Header:
Height => 576
Width => 1024
IsColor => 1
ByteOrderMotorola => 0
ApertureFNumber => f/5.6
UserComment =>
UserCommentEncoding => UNDEFINED
Copyright => Denis
Thumbnail.FileType => 2
Thumbnail.MimeType => image/jpeg
Anmerkungen
Hinweis:
Ist mbstring aktiviert, wird exif
versuchen den Unicode zu verarbeiten, und einen Zeichensatz gemäß
exif.decode_unicode_motorola
und exif.decode_unicode_intel
zu wählen. Die exif-Erweiterung versucht nicht, die Kodierung selbst zu
ermitteln, so dass es die Aufgabe des Benutzers ist, die gewünschte
Kodierung durch Setzen einer der beiden ini-Direktiven anzugeben, bevor
exif_read_data() aufgerufen wird.
Hinweis:
Wird der Parameter file
verwendet, um einen Stream
an diese Funktion zu übergeben, dann muss der Stream suchbar sein. Es ist
zu beachten, dass die Position des Dateizeigers nach dem Aufruf dieser
Funktion unverändert ist.