循环写入多个图像 [Magick, R]
Posted
技术标签:
【中文标题】循环写入多个图像 [Magick, R]【英文标题】:Writing multiple images in a loop [Magick, R] 【发布时间】:2021-05-05 17:47:01 【问题描述】:我想根据文件名结尾选择某些图像,组合它们,然后保存它们。文件名结尾列表存储在h2h.nrp$comparison
。
因此,我写道:
for (i in list(unique(h2h.nrp$comparison)))
pattern <- paste(i, ".png$", sep = "")
Lfile <- list.files("plots - individual/", pattern = pattern)
image1 <- image_border(image_read(paste("plots - individual/", Lfile[1], sep = "")), "white", "70x120")
image2 <- image_border(image_read(paste("plots - individual/", Lfile[2], sep = "")), "white", "70x120")
image3 <- image_border(image_read(paste("plots - individual/", Lfile[3], sep = "")), "white", "70x120")
image4 <- image_border(image_read(paste("plots - individual/", Lfile[4], sep = "")), "white", "70x120")
image5 <- image_border(image_read(paste("plots - individual/", Lfile[5], sep = "")), "white", "70x120")
image6 <- image_border(image_read(paste("plots - individual/", Lfile[6], sep = "")), "white", "70x120")
image7 <- image_border(image_read(paste("plots - individual/", Lfile[7], sep = "")), "white", "70x120")
image8 <- image_border(image_read(paste("plots - individual/", Lfile[8], sep = "")), "white", "70x120")
image9 <- image_border(image_read(paste("plots - individual/", Lfile[9], sep = "")), "white", "70x120")
image10 <- image_border(image_read(paste("plots - individual/", Lfile[10], sep = "")), "white", "70x120")
image11 <- image_border(image_read(paste("plots - individual/", Lfile[11], sep = "")), "white", "70x120")
image12 <- image_border(image_read(paste("plots - individual/", Lfile[12], sep = "")), "white", "70x120")
row1 <- c(image1, image2, image3, image4)
row2 <- c(image5, image6, image7, image8)
row3 <- c(image9, image10, image11, image12)
row1.img <- image_append(row1)
row2.img <- image_append(row2)
row3.img <- image_append(row3)
all.plots <- c(row1.img, row2.img, row3.img)
all.plots.img <- image_append(all.plots, stack = TRUE)
image_write(all.plots.img, path = paste0("vs", i, ".png"), format = "png")
直到最后一行 image_write
似乎运行顺利。
返回一个Error in file(con, "wb") : invalid 'description' argument
错误。
我尝试过 - 只是为了评估问题所在 - 将 path
从 paste0("vs", i, ".png")
更改为 paste0("vs", "i", ".png")
并且效果非常好。当然,这不是所需的输出,因为 vs i.png
图像在每个循环中都会重新写入。此外,当我运行 print(all.plots.img)
时,存储在全局环境中的 all.plots.img
元素看起来是正确的。
所以我的 - 基本的,可能是幼稚的理解 - 是 image_write
行中一定有问题,但我不知道我做错了什么。
我检查了Writing multiple images using Magick on R,其解决方案似乎与我正在做的实际上相同。
我还查看了其他帖子,指出 magick
在内存和文件大小方面存在一些问题 - 我可以确认这不应该是我的问题,因为单个图像的大小约为 1MB。
您能否指出(100% 愚蠢)问题在哪里?
编辑---
我用function
代替lapply
循环列表,它工作得非常好。仍然好奇为什么它不能与 for
循环一起工作以供将来参考(以及希望帮助其他人) - 有什么想法吗?
【问题讨论】:
【参考方案1】:你有一个向量v = unique(h2h.nrp$comparison)
,你有for(i in list(v))
。此循环遍历列表list(v)
的元素,该列表仅包含一个元素:向量v
。所以 i = v
在你的循环中,然后 paste0("vs", i, ".png")
是一个字符向量,对于 path
参数无效,因为它必须是单个字符串。如果要遍历向量 unique(h2h.nrp$comparison)
的元素,则必须执行 for(i in unique(h2h.nrp$comparison))
。
【讨论】:
以上是关于循环写入多个图像 [Magick, R]的主要内容,如果未能解决你的问题,请参考以下文章
无法循环文件,文件名,windows批处理文件和图像magick中的空格
在 R 中创建 GIF 时出现帧顺序问题(库:“magick”和“purrr”)