exif_read_data

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

exif_read_data — Читає заголовки EXIF ​​із файлів зображень

Опис

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

exif_read_data() читає заголовки EXIF ​​із файлів зображень. Таким чином, можна читати метадані, що генеруються цифровими фотоапаратами.

За ідеєю, EXIF-заголовки повинні йти першими в файлах JPEG/TIFF, що генеруються фотоапаратами. Але, на жаль, кожен виробник має своє уявлення про те, як компонувати метадані зображення. Тому будьте готові до ситуації, коли перед Exif-заголовком ще є щось.

HeightиWidth обчислюються аналогічно до обчислень getimagesize()так що ці параметри не повинні бути присутніми в заголовку . html - текстовий рядок, що задає висоту/ширину, яку можна використовувати у звичайному HTML.

Якщо Exif-заголовок містить повідомлення про авторські права (Copyright), саме повідомлення може містити два значення. Ця ситуація не описана у стандарті 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

< td>COMPUTED

FILEFileName, FileSize, FileDateTime, SectionsFound
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.0required_sections тепер допускає значення null.
7.2.0Параметрfileперейменований наstream і може приймати як локальний шлях до файлу, і потоковий ресурс.
7.2.0Додано підтримку наступних форматів EXIF:
  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

Приклади

Приклад #1 Приклад використання exif_read_data()****

Loading...

Перший дзвінок завершується невдачею, оскільки в заголовках зображення немає інформації.

Висновок наведеного прикладу буде схожим на:

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.md: 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)**

Loading...

Висновок наведеного прикладу буде схожим на:

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 використаний для передачі в функцію потоку, цей потік повинен бути перемотується. Зверніть увагу, що файловий позиційний покажчик не буде змінено після завершення роботи цієї функції.

Дивіться також