PHP / (плохие) exif данные / предупреждения, что делать? - PullRequest
7 голосов
/ 03 марта 2011

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

Я заметил (в частности, что изображение отправлено по почте через почтовое приложение iPhone по умолчанию), что данные exif были изменены, что является известной проблемой (почтовое приложение сжимает изображения перед их отправкой, даже если выбран «полный размер») ). Значения, которые я ищу, по-видимому, там, хотя я получаю предупреждения 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:\xampp\htdocs\exif\dumpfolder\exif.php on line 5

Ответы [ 2 ]

29 голосов
/ 04 марта 2011

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

$exif = @exif_read_data(..);

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

4 голосов
/ 16 июня 2018

Несмотря на то, что это старая тема, она пришла мне из ниоткуда с новым 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 для получения любого тега изображения
...