如何循环遍历R中文件夹中的一系列连续文件
How to loop through a sequential series of files in a folder in R
我在几个文件夹中保存了大约 24,000 张照片 (JPG)。我想做的是开发一个 R 脚本,遍历文件夹的所有图像,并为每组连续的 8 张照片创建一个 GIF 动画。我已经有了使用 magick 库计算出的 GIF 动画代码,所以我不需要这方面的帮助。我需要帮助的是如何开发逐步浏览文件夹中的图像并将它们按 8 倍分组的代码。例如,如果我有一个包含 24 张图像的文件夹,我需要一些可以循环遍历文件夹创建的代码基于三组8张图片的3个GIF文件如下:
GIF 1:文件夹中的图像 1-8
GIF 2:文件夹中的图像 9-16
GIF 3:文件夹中的图片 17-24
这是我目前的代码,它将文件夹中的所有图像组合成一个 GIF。我希望可以添加几行简单的代码,这些代码将遍历文件夹中每组 8 张图像以生成 GIF 动画。我还想将输出的 GIF 文件命名为与序列中第一张图像相同的文件名。
library (magick)
library(purrr)
library(gifski)
Folder <- "C:/Path/To/Folder/Containing/JPG/Images"
setwd(Folder)
file.jpg <- list.files(Folder, pattern ="*.jpg", ignore.case = TRUE, full.names = TRUE)
list(file.jpg)
m <- image_read(file.jpg)%>%
image_scale('x500')%>%
image_join()
image_write_gif(m, "MyGIF.gif", delay=1/4)
这应该有效:
library (magick)
library(purrr)
library(gifski)
Folder <- "C:/Path/To/Folder/Containing/JPG/Images"
setwd(Folder)
file.jpg <-
list.files(
Folder,
pattern = "*.png",
ignore.case = TRUE,
full.names = TRUE
#here you have to care that the total number of images is a multiple of 8
l <- split(1:length(file.jpg),rep(1:round(length(file.jpg)/8),each=8))
for (i in l) {
new.file.jpg <- file.jpg[i]
new.file.jpg <- new.file.jpg[complete.cases(new.file.jpg)]
m <- image_read(new.file.jpg)%>%
image_scale('x500')%>%
image_join()
image_write_gif(m, paste0(tools::file_path_sans_ext(basename(new.file.jpg[1])),".gif"), delay=1/4)
}
您也可以通过将生成 gif 的代码包装到函数中来使用 lapply
,但在这种情况下,我认为 for
循环
更清晰
我在几个文件夹中保存了大约 24,000 张照片 (JPG)。我想做的是开发一个 R 脚本,遍历文件夹的所有图像,并为每组连续的 8 张照片创建一个 GIF 动画。我已经有了使用 magick 库计算出的 GIF 动画代码,所以我不需要这方面的帮助。我需要帮助的是如何开发逐步浏览文件夹中的图像并将它们按 8 倍分组的代码。例如,如果我有一个包含 24 张图像的文件夹,我需要一些可以循环遍历文件夹创建的代码基于三组8张图片的3个GIF文件如下: GIF 1:文件夹中的图像 1-8 GIF 2:文件夹中的图像 9-16 GIF 3:文件夹中的图片 17-24
这是我目前的代码,它将文件夹中的所有图像组合成一个 GIF。我希望可以添加几行简单的代码,这些代码将遍历文件夹中每组 8 张图像以生成 GIF 动画。我还想将输出的 GIF 文件命名为与序列中第一张图像相同的文件名。
library (magick)
library(purrr)
library(gifski)
Folder <- "C:/Path/To/Folder/Containing/JPG/Images"
setwd(Folder)
file.jpg <- list.files(Folder, pattern ="*.jpg", ignore.case = TRUE, full.names = TRUE)
list(file.jpg)
m <- image_read(file.jpg)%>%
image_scale('x500')%>%
image_join()
image_write_gif(m, "MyGIF.gif", delay=1/4)
这应该有效:
library (magick)
library(purrr)
library(gifski)
Folder <- "C:/Path/To/Folder/Containing/JPG/Images"
setwd(Folder)
file.jpg <-
list.files(
Folder,
pattern = "*.png",
ignore.case = TRUE,
full.names = TRUE
#here you have to care that the total number of images is a multiple of 8
l <- split(1:length(file.jpg),rep(1:round(length(file.jpg)/8),each=8))
for (i in l) {
new.file.jpg <- file.jpg[i]
new.file.jpg <- new.file.jpg[complete.cases(new.file.jpg)]
m <- image_read(new.file.jpg)%>%
image_scale('x500')%>%
image_join()
image_write_gif(m, paste0(tools::file_path_sans_ext(basename(new.file.jpg[1])),".gif"), delay=1/4)
}
您也可以通过将生成 gif 的代码包装到函数中来使用 lapply
,但在这种情况下,我认为 for
循环