PHP exif_read_data 不再提取 GPS 位置
PHP exif_read_data no longer extracts GPS location
我刚刚通过自制软件安装了 composer,而 brew 似乎安装了新版本的 php (5.6.24)。从那时起,使用 exif_read_data 提取其他元数据(模型、曝光、iso 等),但不再像 "GPSLatitude" 从照片中提取 GPS 信息。
我 运行 通过 exiftool(独立非 php 程序)拍摄的同一张照片,并且照片中确实存在 GPS 数据。
PHP 是用 exif 编译的(因为提取了一些信息),所以我很困惑为什么不再读取 GPS 数据。
这很可能是由于安全修复的回归导致 ext/exif 扩展在 "unknown" 格式的情况下停止解析。
这应该在 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_thumbnail() 基本上不能用于除了 6 种格式之外的任何格式。
目前在 7.x 分支中的修复恢复了这种行为并简单地继续解析那些额外的标签,因此我们不直接支持的那些函数和其他格式将再次起作用。
除此之外,在 7.2 中,我一直在添加对 Samsung、Panasonic 和 DJI 特定标签的支持,目前我也在研究 Sony 特定数据。我们在 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;
}
我刚刚通过自制软件安装了 composer,而 brew 似乎安装了新版本的 php (5.6.24)。从那时起,使用 exif_read_data 提取其他元数据(模型、曝光、iso 等),但不再像 "GPSLatitude" 从照片中提取 GPS 信息。
我 运行 通过 exiftool(独立非 php 程序)拍摄的同一张照片,并且照片中确实存在 GPS 数据。
PHP 是用 exif 编译的(因为提取了一些信息),所以我很困惑为什么不再读取 GPS 数据。
这很可能是由于安全修复的回归导致 ext/exif 扩展在 "unknown" 格式的情况下停止解析。
这应该在 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_thumbnail() 基本上不能用于除了 6 种格式之外的任何格式。
目前在 7.x 分支中的修复恢复了这种行为并简单地继续解析那些额外的标签,因此我们不直接支持的那些函数和其他格式将再次起作用。
除此之外,在 7.2 中,我一直在添加对 Samsung、Panasonic 和 DJI 特定标签的支持,目前我也在研究 Sony 特定数据。我们在 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;
}