用于相机陷印图像管理的 Exif 数据。根据日期时间和文件夹名称为图像创建新名称

Exif data for camera trapping image management. Creating new names for images based on date-time and folder names

我很抱歉提出愚蠢的问题,但我正在努力编写我想要的代码。我正在使用在博文中找到的代码:Dewey Dunnington 的 Fish and Whistle (http://apps.fishandwhistle.net/archives/956)。

我正在尝试编写一个循环,在该循环中我可以使用文件夹名称和 EXIF 数据中的 "CreateDate" 日期时间重命名所有文件夹中的所有图像(递归)。图像存储在相机站(例如 Station "A")文件夹中,然后存储在相机文件夹中(一个站有 2 个相机,例如相机“1”)。

所以一个单独的图像目录是: H:/GitHub/CT_Mara/images/raw_images/A/1/....jpg....jpg....jpg....等

因此,理想情况下,我希望我的图像重命名为 "A1_2017-05-03 15-45-13.jpg",如果有两张或更多照片具有相同的名称,则应将它们命名为:"A1_2017-05-03 15-45-13(1).jpg" 和 "A1_2017-05-03 15-45-13(2).jpg"

我想要完成的事情:

  1. 根据日期和时间重命名所有图像 exifdata$CreateDate
  2. 将 (1)、(2) 等附加到同名图像
  3. 将电台和相机文件夹的名称附加到图像的 名字
  4. 然后最后,作为一个单独的函数,很高兴知道我是如何 可以在 exifdata 框架中创建一个新的库仑,例如 a "species"可以识别动物的库仑

这是我使用的代码:

library(lubridate)

定义 exif 函数

exifRip <- function(filename) {
  command <- paste("exiftool -n -csv",
                   paste(shQuote(filename), collapse=" "))
  read.csv(textConnection(system(command, intern=TRUE)),
           header = TRUE,
           sep = ",",
           quote = "",
           stringsAsFactors = FALSE)
}

从我的目录加载 exif 数据

exifdata <- exifRip(list.files(path="H:/GitHub/CT_Mara/images/raw_images"))
View(exifdata)

设置输出目录

outdir <- dir.create("H:/GitHub/CT_Mara/images/raw_images/EXIFdata")

除此循环外,一切运行完美:

for(i in 1:nrow(exifdata)) {
  row <- exifdata[i, ]
  d <- ymd_hms(row$CreateDate)
  ext <- tools::file_ext(row$SourceFile) #maintain file extension
  newname <- file.path(outdir,
                       sprintf("%04d-%02d-%02d %02d.%02d.%02d.%s",
                               year(d), month(d), day(d), hour(d), minute(d),
                               second(d), ext))
  file.copy(row$SourceFile, newname)
}

我收到以下错误消息:

Error in sprintf("%04d-%02d-%02d %02d.%02d.%02d.%s", year(d), month(d),  : 
  invalid format '%04d'; use format %f, %e, %g or %a for numeric objects
In addition: Warning message:
All formats failed to parse. No formats found. 

任何关于如何清理它的建议将不胜感激。提前致谢。

亲切的问候, 菲利普

下面的 exiftool 命令几乎可以完全满足您的需求,而无需编写脚本。唯一的区别是重复的文件将被命名为 "NAME_1"、"NAME_2" 而不是 "NAME(1)"、"NAME(2)":

exiftool '-filename<%-1:1D%-1:D_${createdate}%+c.%e' -d "%Y-%m-%d %H-%M-%S" -r DIR

其中 DIR 是包含图像的目录的名称。如果您在 Windows 中,则应在第一个参数周围使用双引号而不是单引号。

在此命令中将 "filename" 替换为 "testname" 以进行干式 运行 测试,以在实际进行重命名之前查看文件名。