如何批量编辑 jpg EXIF header 中的字段?

How to batch edit a field in a jpg EXIF header?

我正忙于无人机测绘。然而,图像中的高度值在重复飞行任务(高达 120 米)之间非常不一致。我用来将无人机图像拼接成正射镶嵌图的程序认为无人机在地下飞行,因为图像高度低于实际地面高度。

为了纠正这个问题,我想通过将实际地面高度和无人机高度之间的差异直接添加到图像的 EXIF 中来批量编辑我所有图像的高度值。

例如 原始图像高度 = 250m。编辑后的图像高度 = 250m+x

我找到了 exiftoolr R 包,它允许您使用独立的 ExifTool 和 Perl 程序读取和写入 EXIF 数据(参见此处:https://github.com/JoshOBrien/exiftoolr

到目前为止,这是我的代码:

library(exiftoolr)

#Object containing images in directory
image_files <-dir("D:/....../R/EXIF_Header_Editing/Imagery",full.names=TRUE)

#Reading info
exif_read(image_files, tags = c("filename", "AbsoluteAltitude")) #Only interested in "filename" and "AbsoluteAltitude"

#Saving to new variable
altitude<-list(exif_read(image_files, tags=c("filename","AbsoluteAltitude")))

部分输出如下所示:

       FileName AbsoluteAltitude
1  DJI_0331.JPG          +262.67
2  DJI_0332.JPG          +262.37
3  DJI_0333.JPG          +262.47
4  DJI_0334.JPG          +262.57
5  DJI_0335.JPG          +262.47
6  DJI_0336.JPG          +262.57
ext.

我知道需要将 x 添加到列表中的每个 "AbsoluteAltitude" 条目,然后用这个新调整的高度值覆盖现有的图像高度值,而不编辑任何其他重要的 EXIF 信息。

有什么想法吗?

我有一个程序可以批量编辑 EXIF 海拔高度,但这会使所有值都相同,我需要保持值之间的差异。

提前致谢

如果你愿意尝试只使用 exiftool,你可以试试这个命令:
exiftool -AbsoluteAltitude+=250 <DIRECTORY>

我会先在您的文件的几个副本上对其进行测试,看看它是否满足您的需求。

只是@StarGeek 回答的跟进。我设法找出了 R 等价物。这是我的解决方案:


    #Installing package from GitHub
    if(!require(devtools)) {install.packages("devtools")}
    devtools::install_github("JoshOBrien/exiftoolr",force = TRUE)
    #Installing/updating ExifTool program into exiftoolr directory
    exiftoolr::install_exiftool()
    #Loading packages
    library(exiftoolr)

    #Set working directory
    setwd("D:/..../R/EXIF_Header_Editing")

    #Object containing images
    image_files <- dir("D:/..../R/EXIF_Header_Editing/Imagery",full.names = TRUE)

    #Editing "GPSAltitude" by adding 500m to Altitude value
    exif_call(args = "-GPSAltitude+=500", path = image_files)

打开 .jpg 属性时,显示调整后的海拔高度。

感谢 StarGeek