PHP exif_read_data Недопустимый размер IFD

Я работаю над приложением, где я исправляю ориентацию (если она присутствует) файлов jpeg, загружаемых из ведра AWS.

Здесь вы можете убедиться, что это изображение имеет секцию exif Rotation.

Я загружаю изображение с помощью

file_put_contents('/local/path/to/file', file_get_contents('/path/to/url/image'));

И после того, как я попытаюсь зафиксировать ориентацию через библиотеку изображений Gregwar.

Image::open($path)->fixOrientation()->save($dest, $type, $quality);

Я попытался с несколькими изображениями, и я всегда получаю сообщение

Warning: exif_read_data('/local/path/to/file'): Illegal IFD size

Я думал, что это проблема, связанная с тем, как я получаю изображения, но я также попытался использовать cUrl и fopen с тем же результатом.

У кого-то есть советы?

Ответ 1

PHP 5.6.2x имеет ошибку со своей возможностью EXIF ​​(см. ошибку # 72914, а также # 72819 для получения дополнительной информации). Попытка прочитать данные EXIF ​​приведет к одной из описанных ошибок (недопустимый размер IFD, неверные данные IFD и т.д.).

В настоящее время (2016-11-21) нет исправления для ветки 5.6. В ветке 7 происходит некоторое тестирование.

Реализовать локальное исправление путем тестирования функции, генерирующей ошибки IFD, и, когда это подтвердится, предполагается, что EXIF ​​будет недоступен на время script.

(Вы можете исправить это в загрузчике, если хотите, и "перегрузить" функции, чтобы возвращать значение по умолчанию false/0/null вместо указания поломки)

Ответ 2

Вы можете использовать "@" перед тем, как игнорировать предупреждения: @Image::open($path)->fixOrientation()->save($dest, $type, $quality);

Это много людей, жалующихся на это через Интернет. Вероятно, некоторые данные exif с ошибкой. Если вы работаете так, как хотите, просто документируйте и двигайтесь дальше.

Ответ 3

Я также столкнулся с этой проблемой, используя exif_get_data. Я могу обрабатывать изображения на моем localhost (PHP v5.4.15), но на моем веб-хосте (PHP v5.6.22) ошибку "незаконный размер IFD", хотя я пробовал метод предупреждения "@" игнорировать. Я обнаружил, что на веб-хосте (будь то из-за разной версии или установки) exif_get_data на самом деле бросает исключение, а не выдаёт предупреждение. Я использую данные exif для переориентации изображения, если он был повернут, поэтому, если данные exif неисправны или нет, я просто игнорирую его и ничего не делаю, здесь фрагмент кода:

     try {
        $exif = exif_read_data($filePath);
     }
     catch (Exception $exp) {
        $exif = false;
     }
     if ($exif){
        ...
     }

Ответ 4

вы можете поймать ошибку с помощью set_error_handler

set_error_handler(function() {
  throw new Exception();
 }, E_WARNING);

  try{
     $exifData = exif_read_data($filePath);
  } catch (Exception $e) {
     $exifData = false;
  } finally {
     restore_error_handler();
  }

  if(!$exifData) {
     // do something
  }