我有一台相机(不是手机),可以将 GPS exif 信息插入照片中。
事实是:一直使用“GPS 开启”会耗尽电池。所以我想:在开启 GPS 的情况下只拍一张照片,然后在家里将此 exif 信息添加到其他照片中怎么样?
我想知道您是否知道有哪些应用程序可以帮助我解决这种情况:有一张照片带有有关 GPS 的 exif 信息,将相同的 GPS 信息复制到一批其他照片中。
(我更喜欢 Linux/Mac 解决方案,但我也接受 Windows。如果它是一个命令行应用程序,我不介意。)
答案1
看一眼Exif工具。它是 Exif 信息处理的瑞士军刀,可以做您需要的一切,以及许多其他事情。它是兼容 Windows/Linux/Mac 的命令行工具,也是一个 Perl 模块。免费且开源:
“-tagsFromFile”选项
一个特殊的 ExifTool 选项允许将标签从一个文件复制到另一个文件。执行此操作的命令行语法是“-tagsFromFile SRCFILE”。命令行中此选项后指定的任何标签都将从源文件中提取并写入目标文件。如果没有指定标签,则将复制所有可写标签。此选项非常简单,但功能非常强大。根据源文件和目标文件的格式,读取的某些标签可能在目标文件中无效,在这种情况下不会写入它们。
以下命令将更改当前目录及其子目录下的所有文件(递归),从文件复制所有与 GPS 相关的标签SOURCE.JPG
:
exiftool −overwrite_original_in_place-r-tagsFromFile SOURCE.JPG-gps:all。
另一种方法是将以下内容放入脚本中。传递的第一个参数应该是要从中复制 GPS 坐标的文件,所有其他参数都是要更新的目标文件:
#!/usr/bin/env bash
lon=$(exiftool -s3 -GPSLongitude "$1")
lat=$(exiftool -s3 -GPSLatitude "$1")
exiftool -GPSLongitude="$lon" -GPSLatitude="$lat" "${@:2}"
答案2
您还可以使用 exiv2 - 它速度更快,例如,可以将 exif 数据写入 webp 图像(和其他图像)。
exiv2 -PkV --grep GPSL source.jpg | exiv2 -m- destination.webp
这是来自的示例exiv2 板。
答案3
有一个 bug,exiftool
就是读取和写入经度不一致。所以我写了一个 Perl 脚本,以另一种方式绕过这个 bug(请参阅脚本下方的 bug 描述):
#!/usr/bin/perl
use strict;
die "usage: src.jpg dst.jpg" unless @ARGV == 2;
my ($SRC, $DST) = ($ARGV[0], $ARGV[1]);
my @GPS = `exiftool -c "%.12f" -gpslatitude -gpslongitude $SRC`;
my $N = @GPS;
die "No GPS data in $SRC\n" unless $N >= 2;
my ($LAT,$LON,$NS,$EW) = (0,0,"N","W");
if ($GPS[0] =~ /Lat[^\d]*(\d+\.\d+?)\ ([NS])/) {
$LAT = $1;
$NS = $2;
}
if ($GPS[1] =~ /Lon[^\d]*(\d+\.\d+)\ ([EW])/) {
$LON = $1;
$EW = $2;
}
my $LATREF = $NS eq "N" ? "North" : "South";
my $LONREF = $EW eq "E" ? "East" : "West";
my $CMD = "exiftool -GPSLatitude=$LAT -GPSLongitude=$LON -GPSLongitudeRef=\"$LONREF\" -GPSLatitudeRef=\"$LATREF\" \"$DST\"";
system($CMD) == 0 or die "$!\n";
顺便说一下,这个exiftool
bug 是这里在下面一行
$deg = -$deg if $doSign ? $val =~ /[^A-Z](S(outh)?|W(est)?)\s*$/i : $deg < 0;
哪个失败了$doSign
,undef
哪个是在线上传递的
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lat")',