#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
цикл