循环写入多个图像 [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 错误。

我尝试过 - 只是为了评估问题所在 - 将 pathpaste0("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]的主要内容,如果未能解决你的问题,请参考以下文章

R:使用magick在1个面板中显示4个png图像

无法循环文件,文件名,windows批处理文件和图像magick中的空格

在 R 中创建 GIF 时出现帧顺序问题(库:“magick”和“purrr”)

ImageMagick 使用 qt ans magick++ 打开并写入图像

如何使用 R 中的 magick 包在图像边缘添加羽毛?

R magick:在没有矢量化的情况下合成图像