PHP exif_read_data不再提取GPS位置

时间:2016-08-04 16:11:57

标签: php gps metadata exif

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

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

PHP是用exif编译的(因为有些信息被拉了),所以我很难理解为什么GPS数据不再被读取。

2 个答案:

答案 0 :(得分:6)

这很可能是由于安全修复程序的回归导致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是有限的,因为我们(仅在包括7.1的稳定分支中)支持具有扩展标记的6种格式(每种格式的列表被烘焙到扩展中)。这是回归的来源。解析EXIF数据时,按以下顺序完成:

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

安全修复程序导致了回归,因为您可以制作假签名并在内部绕过它,这可能导致无效读取。如果在我们知道的格式的签名列表中签名不匹配,修复程序将保释解析,从而停止解析而不返回缩略图等数据,导致exif_t​​humbnail()基本上不能用于除6之外的任何其他格式。

当前在7.x分支中的修复,恢复此行为并继续解析这些其他标记,因此我们不直接支持的那些函数和其他格式将再次起作用。

除此之外,在7.2中,我一直在增加对三星,松下和DJI特定标签的支持,而且我目前也在研究索尼的具体数据。我们在php.net上有一个错误报告,如果您有兴趣深入了解这一点,我们会发布这一切:https://bugs.php.net/bug.php?id=72735。如果此补丁无法解决您的问题,我们非常欢迎您提交错误报告,以便我们可以考虑解决此问题。

我希望这对您有所帮助,并感谢您帮助PHP变得更大!

答案 1 :(得分:0)

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

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