Как просмотреть последовательный ряд файлов в папке в R

#r #jpeg #gif

Вопрос:

У меня есть около 24 000 фотографий (JPG), сохраненных в нескольких папках. Что я хотел бы сделать, так это разработать сценарий R, который просматривает все изображения папки и создает анимацию GIF для каждой последовательной группы из 8 фотографий. У меня уже есть код анимации GIF, разработанный с помощью библиотеки магии, так что мне не нужна помощь в этом. Мне нужна помощь в том, как разработать код, который просматривает изображения в папке и группирует их в 8 раз. Например, если у меня есть папка с 24 изображениями, мне нужно что-то, что будет перемещаться по папке, создайте 3 файла GIF на основе трех групп из 8 изображений следующим образом: 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)
 

Ответ №1:

Это должно сработать:

 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)
}
 

Вы также можете использовать lapply , обернув код, генерирующий gif, в функцию, но в данном случае, я думаю, что это более понятный for цикл