PHP/(bad) данные / предупреждения exif, что делать?

Я пишу небольшой скрипт, который собирает пару значений exif из изображений... а именно-дату создания, производителя и модели.

Я замечаю (особенно с изображением, отправленным через приложение iPhone mail по умолчанию), что данные exif были изменены, что является известной проблемой (приложение mail сжимает изображения перед отправкой, даже если выбран "полный размер"). Значения, которые я ищу, появляются там, хотя я получаю предупреждения PHP, обращающиеся к ним. Нет проблем на самом деле получить значения, но предупреждение, очевидно, не работает для меня.

вызов ini_set ('display_errors', 0) скрывает предупреждения, но кажется мне небрежным. Есть ли способ игнорировать это предупреждение в этом сценарии для этого сценария, который немного лучше?

моей первоначальной мыслью было обернуть все в try / catch, но предупреждение по-прежнему отображается на странице.

Я просто использую стандартную функцию exif_read_data (), я думаю, что внешняя библиотека это было бы слишком для того немногого, что мне нужно.

PHP:

if($_GET['i']) {
  $input = strtolower($_GET['i'] . ".jpg");
  if(file_exists($input)) {
    $exif = exif_read_data($input);
    foreach($exif as $key => $value) {
      if(!in_array($key, Array("DateTime","Make","Model"))) {
        unset($exif[$key]);
      }
    }
    ksort($exif);
    print_r($exif);
  }
}

предупреждение:

Warning: exif_read_data(trailmarker.jpg) [exif_read_data]: Illegal IFD size: x00C4 + 2 + x3239*12 = x25B70 > x2B74 in C:xampphtdocsexifdumpfolderexif.php on line 5

2 ответов


можно использовать оператор@ чтобы скрыть предупреждение без использования display_errors, т. е.

$exif = @exif_read_data(..);

это лучше, чем установка display_errors потому что он отключает предупреждения / ошибки только в функции чтения exif и не скрывает другие возможные ошибки в коде.


несмотря на то, что это старая тема, она пришла ко мне из ниоткуда с новым php 7.2: ошибка #75785 много ошибок из exif_read_data

Я согласен с @maraspin, так как любая ошибка по какой-либо причине и не имеет с ней дело означает плохую производительность (время, функции).

МОЯ ЦЕЛЬ: чтобы получить "DateTimeOriginal" загружаемого изображения (а не только creation_date файла tmp - DateTime).

1. Нормальное использование exif_read_data:

$exif = exif_read_data(tmp/phpTBAlvX); or
$exif = exif_read_data($file->tempName, 'ANY_TAG'); or
$exif = exif_read_data($file->tempName, 'IFD0'); or
$exif = exif_read_data($file->tempName, 'EXIF');

PHP предупреждение-yii\base\ErrorException exif_read_data(tmp / phpTBAlvX): Тег процесса (x010D=DocumentNam): незаконные компоненты(0)

2. С помощью оператор@ чтобы скрыть предупреждение:

$exif = @exif_read_data(tmp/phpTBAlvX);

результат: $exif как массив с 20 аргументами, но без "DateTimeOriginal" в нем

    Array (
    [FileName] => phphT9mZy
    [FileDateTime] => 1529171254
    ...
    [SectionsFound] => ANY_TAG, IFD0, EXIF
    [COMPUTED] => Array
        (
            [html] => width="3968" height="2976"
            [Height] => 2976
            [Width] => 3968
            ...
        )
    [ImageWidth] => 3968
    [ImageLength] => 2976
    [BitsPerSample] => Array()
    [ImageDescription] => cof
    [Make] => HUAWEI
    ...
    [DateTime] => 2018:06:14 12:00:38
    [YCbCrPositioning] => 1
)

3. Завершилась решение:

$img = new \Imagick(tmp/phpTBAlvX);
$allProp = $img->getImageProperties();
$exifProp = $img->getImageProperties("exif:*");

результат: $allProp как массив с 70 аргументами с "DateTimeOriginal"

Array (
    [date:create] => 2018-06-16T21:15:24+03:00
    [date:modify] => 2018-06-16T21:15:24+03:00
    [exif:ApertureValue] => 227/100
    [exif:BitsPerSample] => 8, 8, 8
    ...
    [exif:DateTimeOriginal] => 2018:06:14 12:00:38
    [jpeg:colorspace] => 2
    [jpeg:sampling-factor] => 2x2,1x1,1x1
)

результат: $ exifProp как массив с 66 аргументами с "DateTimeOriginal"

Array (
    [exif:ApertureValue] => 227/100
    [exif:BitsPerSample] => 8, 8, 8
    ...
    [exif:DateTimeOriginal] => 2018:06:14 12:00:38
)

МОЕ РЕШЕНИЕ:

  1. никогда не используйте @ для подавления любого предупреждения или кода
  2. использовать класс Imagick для получения любого тега изображения