【问题标题】:Unable to open png device in loop无法循环打开 png 设备
【发布时间】:2012-12-15 03:42:41
【问题描述】:

我一直在摆弄 R 中的一个函数,长话短说,我有一个 for-loop,在每一步中,我使用 png 保存一个情节,然后立即使用 readPNG 所以我可以提取RGB信息。然后我制作第二张图,然后readPNG 这样我可以比较两个图像的 RGB。 问题是我不断收到关于无法启动png() 设备或打开文件进行写入的错误消息,经过多次循环(可以少至几个循环,也可以多至一个几千)。

这里是真正简化的代码,但它具有基本要素,并生成错误消息:

testfun<-function(beg,fini)
{
 library(png)
 setwd("D://mydirectory")
 for (i in beg:fini)
 {
  png("test.png",width=277,height=277) #candidate image
  par(mai=c(0,0,0,0))
  plot(1,type="n",ann=FALSE,xlim=c(0,255),ylim=c(0,255),
         xaxt="n",yaxt="n",frame.plot=F)
  polygon(x=c(10,60,60),y=c(10,10,60),col="red")
  graphics.off()

  image<-readPNG("test.png")
  #code where I get rgb values for original

  png("test2.png",width=277,height=277) #candidate image with diferent params
  par(mai=c(0,0,0,0))
  plot(1,type="n",ann=FALSE,xlim=c(0,255),ylim=c(0,255),
         xaxt="n",yaxt="n",frame.plot=F)
  polygon(x=c(10,60,60),y=c(10,10,60),col="blue")
  graphics.off()

  image<-readPNG("test2.png")
  #code where I get rgb values for second image, and compare
 }
}

还有错误信息:

Error in png("test.png", width = 277, height = 277) : 
  unable to start png() device
In addition: Warning messages:
1: In png("test.png", width = 277, height = 277) :
  Unable to open file 'test.png' for writing
2: In png("test.png", width = 277, height = 277) : opening device failed

最初我将graphics.off() 设置为dev.off(),但后来我想可能是循环太快了,以至于在需要再次打开之前关闭一个设备不够快,并且不知何故变得“混乱”。我还尝试在每个graphics.off 之后使用Sys.sleep(0.1),但这也无济于事。我是否遗漏了一些愚蠢而明显的东西,或者这只是一个设备错误?

【问题讨论】:

  • @你的最后一个问题:dev.off没有问题,代码是按顺序执行的。所以无论一切发生得多么快,首先设备被杀死,然后一个新设备被打开。
  • 您是在交互式控制台中运行此代码,还是使用例如Rscript。而且,png 是否使用更简洁的代码,例如:png("bla.png");plot(1:10);dev.off().
  • 为什么需要png 设备作为中间人?不使用png 将解决您的问题:)。
  • 您的代码在带有 testfun(1,3000) 的 Windows 7 上对我来说运行没有错误。您是否尝试过使用 fname=paste("test",beg%%5,".png",sep=""); png(fname,width=277,height=277) #candidate image 之类的名称更改 png 的名称,这样您就不会在写入然后尝试立即读取同一个文件?
  • 在 cmets 中进行这次冒险是不合适的。这仍然不是一个可重复的问题。似乎超出了某些堆栈限制或缓冲区大小。 @Herc:请使其可重现。

标签: r png


【解决方案1】:

我也遇到过同样的问题,虽然不是在循环的情况下。就我而言,这是因为我将 .png 输出指向一个不存在的目录。

png('./tweets/graphics/unique words.png', width=12, height=8, units='in', res=300)

一旦我创建了目录并正确引用它,错误就消失了,我得到了我的 .png 图像。

【讨论】:

  • 你不知道你对我有多大帮助!花了几个小时试图找出其他答案提到的内存泄漏,这很简单......谢谢!
  • 在使用 png() 之前将 wd 设置为 setwd()
【解决方案2】:

我在循环保存绘图时也遇到了这个问题。 @Dino Fire 给了我一个提示,我的循环生成的文件名包含一个非法字符......

确保文件名合法(查找斜线、与号、撇号等)

【讨论】:

    【解决方案3】:

    对我来说,readPNG() 不起作用的原因是我Rmd (RMarkdown) 文件中运行它

    只要我在 R 控制台或常规脚本中运行代码,它就会立即运行。

    【讨论】:

      【解决方案4】:

      如果您使用的是 RStudio(或 R)将工作目录设置为图片所在的位置(.jpg、.png)。它应该是一个目录,而不仅仅是 (C:/)。

      getwd()
      setwd("C:/RCode/Deep Learning/Downloads/")
      getwd()
      

      【讨论】:

        猜你喜欢
        • 2014-12-31
        • 1970-01-01
        • 2014-08-04
        • 2019-12-18
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2021-04-20
        • 2014-05-18
        相关资源
        最近更新 更多