首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP /(坏)exif数据/警告,该怎么办?

PHP /(坏)exif数据/警告,该怎么办?
EN

Stack Overflow用户
提问于 2018-09-28 07:15:21
回答 2查看 0关注 0票数 0

我正在写一个小脚本,从图像中收集几个exif值...即创建日期,品牌和模型。

我注意到(特别是通过默认iPhone邮件应用程序邮寄的图像)exif数据已被更改,这是一个已知问题(邮件应用程序在发送之前压缩图像,即使选择了“完整尺寸”)。我正在寻找的值似乎在那里,虽然我得到PHP警告访问它们。没有问题实际上获得价值,但警告显然不适合我。

调用ini_set('display_errors',0)会隐藏警告,但对我来说似乎很草率。有没有办法可以忽略这个警告,在这个脚本上,这个场景有点好一点?

我最初的想法是将所有内容包装在try / catch中,但警告仍显示在页面上。

我只是使用标准的exif_read_data()函数,我认为外部库对于我所需要的东西来说会有点多。

PHP:

代码语言:javascript
复制
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”))){
        未设置($ EXIF [$键]);
      }
    }
    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

EN

回答 2

Stack Overflow用户

发布于 2018-09-28 15:46:05

您可以使用@运算符隐藏警告而不使用display_errors,即

代码语言:javascript
复制
$exif = @exif_read_data(..);

这比设置更好,display_errors因为它只在exif读取函数上静音警告/错误,并且不会在代码中隐藏其他可能的错误。

票数 0
EN

Stack Overflow用户

发布于 2018-09-28 17:15:17

尽管这是关于老话题,但它突然出现在新的PHP 7.2中: Bug#75785来自exif_read_data的许多错误

我同意@maraspin,因为任何错误都是有原因而不处理它意味着性能不佳(时间,功能)。

我的目标:获取可上传图像的'DateTimeOriginal'(而不仅仅是tmp文件的creation_date - DateTime)。

1.正常使用exif_read_data:

代码语言:javascript
复制
$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.使用@运算符隐藏警告:

代码语言:javascript
复制
$exif = @exif_read_data(tmp/phpTBAlvX);

结果:$ exif作为带有20个参数的数组,但没有'DateTimeOriginal'

代码语言:javascript
复制
    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.结束解决方案:

代码语言:javascript
复制
$img = new \Imagick(tmp/phpTBAlvX);
$allProp = $img->getImageProperties();
$exifProp = $img->getImageProperties("exif:*");

结果:$ allProp为70个带有'DateTimeOriginal'参数的数组

代码语言:javascript
复制
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作为带有'DateTimeOriginal'的66个参数的数组

代码语言:javascript
复制
Array (
    [exif:ApertureValue] => 227/100
    [exif:BitsPerSample] => 8, 8, 8
    ...
    [exif:DateTimeOriginal] => 2018:06:14 12:00:38
)

我的决定:

  1. 永远不要使用@来抑制任何警告或代码
  2. 使用Imagick类获取图像的任何标记
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档