exif_read_data
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
exif_read_data —
Читает заголовки EXIF из файлов изображений
Описание
По идее, EXIF-заголовки должны идти первыми в JPEG/TIFF
файлах, генерируемых фотоаппаратами. Но, к сожалению, каждый производитель имеет
своё представление того, каким образом компоновать метаданные изображения.
Поэтому будьте готовы к ситуации, когда перед Exif-заголовком есть ещё что-то.
Height
и Width
вычисляются аналогично
вычислениям getimagesize(), так что эти параметры не обязаны
присутствовать в заголовке. html
- текстовая строка, задающая
высоту/ширину, которую можно использовать в обычном HTML.
Если Exif-заголовок содержит сообщение об авторских правах (Copyright), само
сообщение может содержать 2 значения. Эта ситуация не описана в стандарте
Exif 2.10, поэтому раздел COMPUTED
будет содержать оба
этих значения в полях Copyright.Photographer
и
Copyright.Editor
. В то же время разделы
IFD0
будут содержать массив байт с NULL-символом в качестве
разделителя этих двух значений либо только первое значение, если тип файла
определён неверно (нормальная ситуация для Exif). Раздел
COMPUTED
будет также содержать Copyright
,
это может быть либо исходная строка, либо список из владельца
фотографии и редактора через запятую.
Тег UserComment
имеет те же проблемы, что и Copyright.
Он может хранить 2 значения. Первое - использованную кодировку, второе -
само значение. В этом случае раздел IFD
содержит либо
кодировку, либо массив байт. Раздел COMPUTED
будет хранить
оба этих значения в полях UserCommentEncoding
и
UserComment
. Содержимое UserComment
будет доступно в любом случае, поэтому предпочтительней использовать его вместо
раздела IFD0
.
Также exif_read_data() проверяет EXIF теги на соответствие
спецификации EXIF (» http://exif.org/Exif2-2.PDF, стр. 20).
Список параметров
-
file
-
Местоположение файла с изображением. Может быть как путём к файлу,
так и потоковым ресурсом (можно использовать обёртки).
-
required_sections
-
Список разделённых запятой разделов, которые должны быть представлены
в результирующем массиве (array). Если ни один из разделов найти
не удастся, функция вернёт false
.
-
as_arrays
-
Определяет, формировать ли разделы в виде массивов. Разделы
required_sections
, COMPUTED
,
THUMBNAIL
и COMMENT
всегда
делаются массивами, так как они могут содержать значения, имена которых
будут конфликтовать с именами в других разделах.
-
read_thumbnail
-
Если true
, будет прочитан сам эскиз. В противном случае будет прочитана
только информация в тегах.
Возвращаемые значения
Возвращает ассоциативный массив (array), в котором ключами будут
имена заголовков, а значениями - значения соответствующие этим заголовкам.
Если никаких данных вернуть нельзя, exif_read_data()
вернёт false
.
Ошибки
Ошибки уровня E_WARNING
и/или E_NOTICE
могут возникать для неподдерживаемых тегов или других потенциальных условий ошибки, но функция
всё равно пытается прочитать всю понятную информацию.
Примеры
Пример #1 Пример использования exif_read_data()
<?php
echo "test1.jpg:<br />\n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo $exif===false ? "Не найдено данных заголовка.<br />\n" : "Изображение содержит заголовки<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";
}
}
?>
Первый вызов завершается неудачей, так как в заголовках
изображения нет информации.
Вывод приведённого примера будет похож на:
test1.jpg:
No header data found.
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
Пример #2 Использование exif_read_data() с потоковым ресурсом (доступно с PHP 7.2.0)
<?php
// Открываем файл в бинарном режиме
$fp = fopen('/path/to/image.jpg', 'rb');
if (!$fp) {
echo 'Ошибка: Невозможно открыть файл для чтения';
exit;
}
// Попытка прочитать заголовки exif
$headers = exif_read_data($fp);
if (!$headers) {
echo 'Ошибка: невозможно прочитать заголовки exif';
exit;
}
// Напечатать заголовки 'COMPUTED'
echo 'Заголовки EXIF:' . PHP_EOL;
foreach ($headers['COMPUTED'] as $header => $value) {
printf(' %s => %s%s', $header, $value, PHP_EOL);
}
?>
Вывод приведённого примера будет похож на:
EXIF Headers:
Height => 576
Width => 1024
IsColor => 1
ByteOrderMotorola => 0
ApertureFNumber => f/5.6
UserComment =>
UserCommentEncoding => UNDEFINED
Copyright => Denis
Thumbnail.FileType => 2
Thumbnail.MimeType => image/jpeg
Примечания
Замечание:
Если разрешён mbstring, то exif будет пытаться
обрабатывать юникод и брать кодировку как указано в
exif.decode_unicode_motorola и
exif.decode_unicode_intel.
Модуль exif не будет пытаться самостоятельно определить кодировку и указание
правильной кодировки остаётся на совести пользователя путём установки одной из
двух INI-директив перед вызовом exif_read_data().
Замечание:
Если параметр file
использован для передачи в функцию
потока, то этот поток должен быть перематываемым. Обратите внимание, что файловый
позиционный указатель не будет изменён после завершения работы этой функции.