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
}