exif_read_data
(PHP 4 >= 4.2.0, PHP 5, PHP 7)
exif_read_data — Читает заголовки EXIF из файлов изображений
Описание
$file
, string|null $required_sections
= null
, bool $as_arrays
= false
, bool $read_thumbnail
= false
) : array|falseexif_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).
Замечание:
Windows Me/XP могут затирать Exif-заголовки при подключении фотоаппарата.
Список параметров
-
file
-
Местоположение файла с изображением. Может быть как путем к файлу, так и потоковым ресурсом (можно использовать обертки).
-
required_sections
-
Список разделенных запятой разделов, которые должны быть представлены в результирующем массиве (array). Если ни один из разделов найти не удастся, функция вернет
false
.FILE FileName, FileSize, FileDateTime, SectionsFound COMPUTED html, Width, Height, IsColor, и другие. Height и Width вычисляются аналогично getimagesize(), поэтому их не обязательно включать в заголовок. html
- текстовая строка, задающая высоту/ширину, которую можно использовать в обычном HTML.ANY_TAG Любая информация заключенная в тег, например, IFD0
,EXIF
, ...IFD0 Все данные тега IFD0. В обычных изображениях в нем хранится размер изображения. THUMBNAIL Если файл содержит второй раздел IFD
, то считается, что у изображения есть эскиз. Вся информация об эскизе хранится в этом разделе.COMMENT Заголовки комментариев JPEG изображений. EXIF Раздел EXIF является подразделом IFD0
. Он содержит более детальную информацию об изображении. Большинство его записей зависят от фотоаппарата. -
as_arrays
-
Определяет, формировать ли разделы в виде массивов. Разделы
required_sections
,COMPUTED
,THUMBNAIL
иCOMMENT
всегда делаются массивами, так как они могут содержать значения, имена которых будут конфликтовать с именами в других разделах. -
read_thumbnail
-
Если
true
, будет прочитан сам эскиз. В противном случае будет прочитана только информация в тегах.
Возвращаемые значения
Возвращает ассоциативный массив (array), в котором ключами будут
имена заголовков, а значениями - значения соответствующие этим заголовкам.
Если никаких данных вернуть нельзя, exif_read_data()
вернет false
.
Ошибки
Ошибки уровня E_WARNING
и/или E_NOTICE
могут возникать для неподдерживаемых тегов или других потенциальных условий ошибки, но функция
все равно пытается прочитать всю понятную информацию.
Список изменений
Версия | Описание |
---|---|
8.0.0 |
required_sections теперь допускает значение null.
|
7.2.0 |
Параметр file переименован в
stream и может принимать как локальный путь
к файлу, так и потоковый ресурс.
|
7.2.0 |
Добавлена поддержка следующих форматов EXIF:
|
Примеры
Пример #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
использован для передачи в функцию потока, то этот поток должен быть перематываемым. Обратите внимание, что файловый позиционный указатель не будет изменен после завершения работы этой функции.
Смотрите также
- exif_thumbnail() - Получает встроенное превью изображения
- getimagesize() - Получение размера изображения
- Поддерживаемые протоколы и обертки