我正在编写一个小脚本,从图像中收集几个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
答案 0 :(得分:28)
您可以使用@ operator隐藏警告而不使用display_errors,即
$exif = @exif_read_data(..);
这比设置display_errors
更好,因为它只会在exif读取函数上静音警告/错误,并且不会在代码中隐藏其他可能的错误。
答案 1 :(得分:4)
尽管这是关于旧主题的,但它突然出现在新的php 7.2中: Bug #75785 Many errors from exif_read_data
我同意@maraspin,因为任何错误都是有原因而不处理它意味着性能不佳(时间,功能)。
我的目标:获取' DateTimeOriginal'可上传图像(而不仅仅是tmp文件的creation_date - 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。使用@ operator隐藏警告:
$exif = @exif_read_data(tmp/phpTBAlvX);
结果:$ exif作为包含20个参数的数组,但没有&#39; DateTimeOriginal&#39;在其中
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个参数的数组&#39; DateTimeOriginal&#39;
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个参数&#39; DateTimeOriginal&#39;
Array (
[exif:ApertureValue] => 227/100
[exif:BitsPerSample] => 8, 8, 8
...
[exif:DateTimeOriginal] => 2018:06:14 12:00:38
)
我的决定: