【问题标题】:PHP exif_read_data Illegal IFD sizePHP exif_read_data 非法 IFD 大小
【发布时间】:2016-09-18 01:18:20
【问题描述】:

我正在开发一个应用程序,用于修复从 AWS 存储桶下载的 jpeg 文件的方向(如果存在)。

Here你可以验证这张图片是否有exif Rotation部分。

我用

下载图片
file_put_contents('/local/path/to/file', file_get_contents('/path/to/url/image'));

在我尝试通过Gregwar Image library 修复方向之后。

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

我尝试了几张图片,但我总是收到消息

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

我认为这是与我如何检索图像有关的问题,但我也尝试使用 cUrl 和 fopen 得到相同的结果。

有人有什么建议吗?

【问题讨论】:

    标签: php jpeg exif


    【解决方案1】:

    您可以在忽略警告之前使用“@”:@Image::open($path)->fixOrientation()->save($dest, $type, $quality);

    这是很多人在互联网上抱怨的。可能是一些有错误的 exif 数据。如果您的操作按您想要的方式进行,只需记录并继续。

    【讨论】:

    • 嗨,谢谢你的建议,但我的问题不是警告(库包装),而是为什么我无法检查 exif 数据。目前,我无法修复任何图像的方向,这令人沮丧。
    • 试试这个:->useFallback(false):github.com/Gregwar/Image/issues/96
    • 嗨@auco,很遗憾没有。当我收到警告时,我丢弃了图像以修复方向。
    【解决方案2】:

    PHP 5.6.2x 的 EXIF 功能存在错误(请参阅错误 #72914 以及 #72819 了解更多信息)。尝试读取 EXIF 数据将导致上述错误之一(非法 IFD 大小、IFD 错误数据等)。

    目前 (2016-11-21) 5.6 分支没有可用的修复程序。分支 7 正在进行一些测试。

    通过测试引发 IFD 错误的函数来实施本地修复,并在确认后假定 EXIF 在脚本执行期间不可用。

    (您可以根据需要将其修补到加载程序中,并“重载”函数以返回默认的 false/0/null 来指示损坏)

    【讨论】:

    • 我也在 php 7.0.21 中得到了这个。
    【解决方案3】:

    我在使用 exif_get_data 时也遇到过这个问题。我可以在我的本地主机(PHP v5.4.15)上处理图像,但在我的网络主机(PHP v5.6.22)上,即使我尝试了“@”忽略警告方法,也会出现错误“非法 IFD 大小”。 我发现在网络主机上(无论是因为不同的版本还是安装),exif_get_data 实际上是抛出异常而不是发出警告。如果图片被旋转,我正在使用 exif 数据来重新定位图片,所以如果 exif 数据有问题或不存在,我只是忽略它并且什么都不做,这里是代码 sn-p:

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

    【讨论】:

    • PHP 标准函数不抛出异常。
    【解决方案4】:

    生产环境中,最好还是隐藏警告!

    所以我将他的错误报告更改为 ERRORS,仅在脚本开头使用以下行:

    error_reporting(E_ERROR);
    

    【讨论】:

      【解决方案5】:

      您可以使用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
        }
      

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 2016-12-10
        • 2011-10-17
        • 2011-04-21
        • 1970-01-01
        相关资源
        最近更新 更多