PHP exif_read_data 不再提取 GPS 位置信息。

3
我刚刚通过homebrew安装了composer,brew似乎安装了一个新版本的php(5.6.24)。从那时起,使用exif_read_data提取其他元数据(型号、曝光、iso等),但不再从照片中提取像“GPSLatitude”这样的GPS信息。
我用exiftool(独立的非php程序)运行了同一张照片,发现照片中确实存在GPS数据。
PHP是编译有exif的(因为某些信息被提取),所以我很困惑为什么不再读取GPS数据。
2个回答

5
这很可能是由于一个安全修复引起的回归,该修复导致ext/exif扩展在出现“未知”格式时停止解析。
这个问题应该在7.x分支中得到解决(7.0.10和7.1.0 Beta 1),尽管它没有合并到5.x分支,但可能会找到其方式。
如果您想要一个补丁(转换为5.x应该相当容易),那么我在这里提交了它: http://git.php.net/?p=php-src.git;a=commit;h=aabcb5481d9e717df77192dab2894468b9fc63b4 以下是关于ext/exif如何工作以及出了什么问题的一些背景信息:
在我们内部解析exif数据时,它将按照规范提供的标准exif标签读取,但某些格式具有某些自定义标签。这些通常也被解析,但是ext/exif在某种程度上受限,因为我们只支持6种带有扩展标签的格式(包括7.1的稳定分支中的列表)。这就是回归的原因。在解析EXIF数据时,按照以下顺序进行:
  • 标准EXIF数据
  • 查找已知格式以解析自定义标签,如果找到匹配的签名,则解析它们
  • 解析其他数据,如缩略图、GPS等
安全修复导致回归,因为您可以伪造签名并在内部绕过此问题,这可能会导致无效读取。修复程序将在已知格式的烘焙签名列表中出现签名不匹配的情况下取消解析,从而停止解析并不返回数据,例如缩略图,导致exif_thumbnail()本质上对除6种格式以外的所有格式都无法使用。
7.x分支中目前的修复方法恢复了这种行为,并继续解析那些附加标签,因此那些函数和我们不直接支持的其他格式将再次起作用。
此外,在7.2中,我一直在添加对三星、松下和DJI特定标签的支持,目前正在研究索尼特定数据。如果您有兴趣深入了解,请在php.net上查看我们的错误报告:https://bugs.php.net/bug.php?id=72735。如果此补丁未解决您的问题,则欢迎提交错误报告,以便我们可以解决此问题。
希望这对您有所帮助,感谢您的帮助,使PHP变得更加出色!

谢谢,那似乎就是问题所在。我不确定如何自己应用补丁并重新编译PHP,但我的应用程序也需要EXIF GPS(目前所有新上传的应用都没有GPS)。我可能会降级回到5.6.23,直到看到后续版本应用了这个补丁(希望如此)。再次感谢您的快速回复。 - John Brennan
暂时先切换到以前安装的版本。 使用Homebrew命令:brew switch php56 5.6.23 - John Brennan
PHP 5.5.9也存在同样的问题,没有GPS标签。 - MaxV
我在Windows上使用7.2.7版本,但它没有显示GPS和海拔数据。有什么窍门吗? - M H

0
如果您可以访问服务器,您可以安装一个名为exiftool的Perl程序。 https://www.sno.phy.queensu.ca/~phil/exiftool/ 您可以将此软件放置在服务器上的任何目录中。 我将其放在了我的网站目录的子目录中。
使用此脚本,如果exif_read_data在您的PHP版本上无法工作,则可以检索GPS数据。
function get_latlon($img){
  $path="/YOURIMAGES/";
  $path .= $img;
  exec("/directory_of_exiftool/exiftool -gpslatitude -gpslongitude -c \"%.6f\"  $path",$exifdata);
  $lat=$exifdata[0];$lat=str_ireplace("GPS Latitude","",$lat);$lat=str_ireplace("N","",$lat);$lat=trim(str_ireplace(":","",$lat));

  $lon=$exifdata[1];$lon=str_ireplace("GPS Longitude","",$lon);$lon=str_ireplace("E","",$lon);$lon=trim(str_ireplace(":","",$lon));

  if ($lat !=""){$location="$lat,$lon";}

  return $location;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接