11

我一直在摆弄 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()但后来认为循环可能太快了,以至于在需要再次打开之前关闭一个设备不够快,并且不知何故变得“混乱”。我也尝试Sys.sleep(0.1)在 each 之后使用graphics.off,但这也无济于事。我是否遗漏了一些愚蠢而明显的东西,或者这只是一个设备错误?

4

4 回答 4

20

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

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

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

于 2014-09-30T14:07:24.860 回答
10

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

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

于 2015-03-26T04:22:53.997 回答
0

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

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

于 2020-04-30T09:24:11.787 回答
0

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

getwd()
setwd("C:/RCode/Deep Learning/Downloads/")
getwd()
于 2020-05-15T11:57:51.290 回答