PHP exif_read_data不再提取GPS位置


PHP exif_read_data no longer extracts GPS location

我刚刚通过自制软件安装了composer,brew似乎安装了一个新版本的php(5.6.24)。从那时起,使用exif_read_data提取其他元数据(模型、曝光、iso等),但不再从照片中提取GPS信息,如"GPSLatitude"。

我通过exiftool(独立的非php程序)运行了同一张照片,照片中确实存在GPS数据。

PHP是用exif编译的(因为一些信息被提取),所以我很困惑为什么GPS数据不再被读取。

这很可能是由于安全修复程序的回归导致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=提交;h=aabcb5481d9e717df77192dab2894468b9fc63b4

以下是ext/exif如何工作以及出现问题的一些背景:

在内部,当我们解析exif数据时,它将读取规范提供的标准exif标记,但某些格式具有某些自定义标记。这些通常也会被解析,但是ext/exif受到限制,因为我们只(在包括7.1在内的稳定分支中)支持6种带有扩展标签的格式(每个格式的列表都被烘焙到扩展中)。这就是回归的作用所在。当解析EXIF数据时,它按以下顺序进行:

  • 标准EXIF数据
  • 查找解析自定义标记的已知格式,如果找到匹配的签名,则解析它们
  • 分析其他数据,如缩略图、GPS等

安全修复导致了回归,因为你可以伪造签名并在内部绕过它,这可能会导致无效读取。如果我们所知道的格式中的烘焙签名列表中的签名不匹配,则该修复程序将帮助解析,从而停止解析而不返回缩略图等数据,导致exif_tumbnail()基本上不适用于除6种格式之外的任何格式。

目前在7.x分支中的修复程序恢复了这种行为,并简单地继续解析那些额外的标记,因此我们不直接支持的那些函数和其他格式将再次工作。

除此之外,在7.2中,我一直在添加对三星、松下和大疆特定标签的支持,目前我也在研究索尼特定的数据。我们在php.net上有一份错误报告,它让你大放异彩,以防你有兴趣更深入地了解以下内容:https://bugs.php.net/bug.php?id=72735.如果这个补丁不能解决你的问题,我们非常欢迎你提交一份错误报告,这样我们就可以考虑解决这个问题。

我希望这对你有帮助,感谢你帮助PHP变得更伟大!

如果您可以访问服务器,则可以安装名为exiftool的Perl程序。https://www.sno.phy.queensu.ca/~phil/exiftool/您可以将此软件放在服务器上的任何目录中。我把它放在我的网络目录的一个子目录中。

使用此脚本,如果exif_read_data不起作用,则可以检索GPS数据您的PHP版本。

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;
}