代码之家  ›  专栏  ›  技术社区  ›  Sharpie

使用R创建光栅图像

  •  6
  • Sharpie  · 技术社区  · 15 年前

    我试图用r从数据矩阵中创建光栅图像。但是,我的图像边缘出现了一些奇怪的伪影。

    我使用的代码如下:

    测试图像<-as.光栅(0:1,nrow=3,ncol=5) 作证 [,1][,2][,3][,4][,5] [1,]“000000”“ffffff”“000000”“ffffff”“000000” [2,]“ffffff”“000000”“ffffff”“000000”“ffffff” [3,]“000000”“ffffff”“000000”“ffffff”“000000”“ffffff”“000000” png('test.png',width=5,height=3,units='px') #只需要图片,没有空白,寄宿生或其他花哨的东西。 par(mar=c(0,0,0,0)) 新的() plotarea=par(图) 光栅图像(测试图像,Plotarea[1],Plotarea[3], plotarea[2],plotarea[4],interpolate=false) DEFF() < /代码>

    这是在R 2.12.0中在OS X上执行的,但我从R 2.11.0获得了相同的输出。


    我得到的输出如下(从5x3到150x90)

    角落里的像素应该是黑色的,这表明正在发生某种形式的插值。


    我希望看到的输出是:

    关于我的代码为什么不能从矩阵中忠实地生成光栅图像有什么建议吗?


    预期用途

    这是我正在处理的一个包,因此如果可能的话,我希望留在R基包中,以避免引入其他依赖项。该包实现了图形设备,因此,如果有人从 geraster()传递的信息中获取C级解决方案,则 src/main/engine.c 并仅使用R库创建PNG,则我愿意为其提供一个良好的快照。


    OS X解决方案

    正如NICO所指出的,错误行为是抗锯齿的结果。如果告诉绘图使用可以禁用抗锯齿的输出方法(如cairo graphics),则绘图的行为与预期一致:

    png('test.png',width=5,height=3,units='px',type='cairo',antialias=null)
    < /代码> 
    
    

    在OS X上,png()的默认后端是quartz,但是png(…,type='quartz')currently ignores directives set byquartz.options()。如果设备是通过调用quartz()而不是使用png()来启动的,则可以在OS X上本机生成可靠的输出

    quartz(file='test.png',type='png',width=5,height=3,dpi=1,antialias=false)
    < /代码> 
    
    

    Windows有不同的想法

    在Windows上生成以下输出:

    根据Paul Murrell(R graphics的仁慈独裁者)给出的答案 设备)在R-HELP邮件列表上:

    < Buff行情>

    这是一个舍入(截断)问题。正在进行修复。

    < /块引用>

    除非光栅图像包含非常少量的像素,否则在窗口上的这种行为不应该是明显的。

    我使用的代码如下:

    # From the example for rasterImage(). A 3 pixel by 5 pixel b/w checkerboard.
    testImage <- as.raster(0:1, nrow=3, ncol=5)
    
    testImage
         [,1]      [,2]      [,3]      [,4]      [,5]     
    [1,] "#000000" "#FFFFFF" "#000000" "#FFFFFF" "#000000"
    [2,] "#FFFFFF" "#000000" "#FFFFFF" "#000000" "#FFFFFF"
    [3,] "#000000" "#FFFFFF" "#000000" "#FFFFFF" "#000000"
    
    png('test.png', width=5, height=3, units='px')
    
    # Just want the image, no margins, boarders or other fancy stuff.
    par(mar = c(0,0,0,0) )
    plot.new()
    plotArea = par('fig')
    
    rasterImage(testImage, plotArea[1], plotArea[3],
      plotArea[2], plotArea[4], interpolate = FALSE )
    
    dev.off()
    

    这是在R 2.12.0中在OS X上执行的,但我从R 2.11.0得到了相同的输出。


    我得到的输出如下(从5x3到150x90)

    R output

    角落里的像素应该是黑色的,这表明正在发生某种形式的插值。


    我希望看到的输出是:

    Expected output

    关于我的代码为什么不能从矩阵中忠实地生成光栅图像有什么建议吗?


    预期用途

    这是我正在处理的一个包,因此如果可能的话,我希望留在R基包中,以避免引入其他依赖项。这个包实现了一个图形设备,因此如果有人有一个C级的解决方案,可以从传递的信息中获取GERaster()在里面src/main/engine.c并且只使用R库创建PNG,我也愿意尝试一下。


    OS X解决方案

    正如NICO所指出的,错误行为是抗锯齿的结果。如果png()要求使用可以禁用抗锯齿的输出方法,例如cairo图形:

    png('test.png', width=5, height=3, units='px', type='cairo', antialias=NULL)
    

    在OS X上,默认的后端PNG()不过,是石英png(..., type='quartz')当前忽略由设置的指令quartz.options(). 如果设备是通过调用quartz()直接代替使用PNG():

    quartz(file='test.png', type='png', width=5, height=3, dpi=1, antialias=FALSE)
    

    Windows有不同的想法

    在Windows上生成以下输出:

    Windows output

    根据an answer由Paul Murrell(R图形的仁慈独裁者)提供 设备)在R-HELP邮件列表中:

    这是一个舍入(截断)问题。正在修复。

    除非光栅图像包含非常少量的像素,否则在窗口上的这种行为不应该是明显的。

    2 回复  |  直到 15 年前
        1
  •  1
  •   nico    15 年前

    你的代码按我的预期工作…(R 2.11.1在Fedora核心13下运行)。 这似乎是一个抗过敏的问题

    这个代码起作用

    png('test.png', width=5, height=3, units='px', type='cairo', antialias=NULL)
    

    可以在中设置默认的抗锯齿选项 X11.options

    ?X11.options

    antialias: for cairo types, the type of anti-aliasing (if any) to be
          used.  One of ‘c("default", "none", "gray", "subpixel")’.
    
        2
  •  1
  •   Roman LuÅ¡trik    15 年前

    你听说过吗 raster 包裹?也许这是一种服务。

    library(raster)
    test.image <- matrix(c(1, 0, 1, 0, 0, 1, 0, 1), ncol = 4, byrow = TRUE)
    plot(raster(test.image))
    
    png("test.png")
    image(test.image, axes = FALSE)
    dev.off()