在R中保存旋转图像-避免背景并保持大小

在R中保存旋转图像-避免背景并保持大小,r,background,save,raster,R,Background,Save,Raster,我有下面的代码,这是基于我以前的。当我保存图像SaveThisPlot.png时,它会创建不需要的背景,并且图像大小也会更改(它会减小)。如何保存图像,使旋转部分的大小与之前的完全相同(77行101列),并且没有背景 library(raster) r1 <- brick(system.file("external/rlogo.grd", package="raster")) r1 x <- crop(r1, extent(0,ncol(r1),0,nrow(r1))) plotRG

我有下面的代码,这是基于我以前的。当我保存图像SaveThisPlot.png时,它会创建不需要的背景,并且图像大小也会更改(它会减小)。如何保存图像,使旋转部分的大小与之前的完全相同(77行101列),并且没有背景

library(raster)
r1 <- brick(system.file("external/rlogo.grd", package="raster"))
r1
x <- crop(r1, extent(0,ncol(r1),0,nrow(r1)))
plotRGB(x)

x1 <- 0:ncol(x)
y1 <- 0:nrow(x)
z <- matrix(1, nrow=length(x1), ncol=length(y1))

col.mat <- t(apply(matrix(rgb(getValues(x)/255), nrow=nrow(x), byrow=TRUE), 2, rev))

# Rotate 45 degrees
persp(x1, y1, z, zlim=c(0,2), theta = 20, phi = 90, 
      col = col.mat, scale=FALSE, border=NA, box=FALSE)
png("SaveThisPlot.png")
persp(x1, y1, z, zlim=c(0,2), theta = 20, phi = 90, 
      col = col.mat, scale=FALSE, border=NA, box=FALSE)
dev.off()
库(光栅)

r1可以使用透明背景,但旋转绘图需要重新调整大小

保存绘图时,可以设置
png(“SaveThisPlot.png”,bg=“transparent”)
以防止显示背景。尝试:

png("SaveThisPlot.png", width=101 height=77, units="px", pointsize=1, bg="transparent")
请注意,如果您尝试使用旋转版本的徽标执行此操作,则徽标会重新调整大小,以适合101 x 77像素的png。如果你想旋转它并保持徽标大小,你必须调整png的大小,ass@RomanLuštrik在他的评论中提到。如果您可以选择重新调整大小,则只需通过三角函数来找到合适的高度和宽度参数

您可以尝试设置新的高度和宽度,以使用一些三角法保存png。下面是一个旋转35度的示例:

# hypotenuse
hypot <- sqrt((nrow(x)/2)^2 + (ncol(x)/2)^2) 
# angle
angle <- asin((nrow(x)/2)/ hypot)/(pi/180)

width <- 2 * max(abs(hypot * cos((angle + 35) * pi/180)), 
                 abs(hypot * cos((- angle + 35) * pi/180)))

height <- 2 * max(abs(hypot * sin((angle + 35) * pi/180)), 
                 abs(hypot * sin((- angle + 35) * pi/180)))


png("SaveThisPlot.png", height=height, width=width, units="px", pointsize=1,
    bg="transparent")
par(mar=c(0,0,0,0), xaxs = "i", yaxs = "i")
persp(x1, y1, z, zlim=c(0,2), theta = 35, phi = 90, 
      col = col.mat, scale=FALSE, border=NA, box=FALSE)
dev.off()
然后,设置场景,调用
persp3d
,旋转场景并保存

open3d() 
rgl.pop("lights") 
light3d(specular="black") # to reduce reflection
persp3d(x1,y1,z, col=col.mat2, ylab="", xlab="", zlab="",
        axes=FALSE, smooth=FALSE, aspect="iso")

# Rotate it by defining the userMatrix, then save    
par3d(userMatrix = rotationMatrix(0*pi/180, 0, 0, 1))
rgl.snapshot("Rlogo_0.png") # to save

par3d(userMatrix = rotationMatrix(45*pi/180, 0, 0, 1))
rgl.snapshot("Rlogo_45.png")

par3d(userMatrix = rotationMatrix(135*pi/180, 0, 0, 1))
rgl.snapshot("Rlogo_135.png")

要将此图像强制放在较小的窗口中,您可以使用
windowRect
zoom
参数组合来操纵rgl显示窗口的大小和背景量()。但是,
rgl
当前不支持透明背景

open3d()
bg3d(color="#FF00FF") # pink background (some color not in the actual image)
rgl.pop("lights") 
light3d(specular="black") 
persp3d(x1,y1,z, col=col.mat2, axes=FALSE,
     ylab="", xlab="", zlab="", smooth=FALSE, aspect="iso")
rgl.viewpoint(zoom=0.52)
par3d(userMatrix = rotationMatrix(0*pi/180, 0, 0, 1), windowRect=c(0,0, 101, 77))
rgl.snapshot("Rlogo_77h124w.png")
par3d(userMatrix = rotationMatrix(45*pi/180, 0, 0, 1), windowRect=c(0,0, 101, 77))
rgl.snapshot("Rlogo45_77h124w.png")
我无法使窗口宽度小于124像素。在我的计算机上,rgl窗口的最小宽度似乎为124像素,因为我无法将窗口缩小(即无法折叠窗口顶部的最小化、还原和关闭按钮)

要获得透明背景,可以导入这些保存的PNG,并将alpha值1指定给背景颜色(“FF69B4”):


除非您旋转一个圆,否则图像尺寸必须改变。您的答案很接近。rlogo.grd有77行和101列。但当我看到上面创建的所有3个图像时,它们显示在256*256像素的白色框中。我怎样才能避免这个框,并确保图像大小保持不变?我将对每个图像执行光学字符识别OCR,颜色可能会影响我的结果。无论如何,为了避免图像大小的变化?我看了你上面发布的最后一张图像。这不是我要找的,我想有一个白色的盒子,它有大小为101*77的R符号,不管它的角度如何。我感谢你的努力…谢谢
open3d()
bg3d(color="#FF00FF") # pink background (some color not in the actual image)
rgl.pop("lights") 
light3d(specular="black") 
persp3d(x1,y1,z, col=col.mat2, axes=FALSE,
     ylab="", xlab="", zlab="", smooth=FALSE, aspect="iso")
rgl.viewpoint(zoom=0.52)
par3d(userMatrix = rotationMatrix(0*pi/180, 0, 0, 1), windowRect=c(0,0, 101, 77))
rgl.snapshot("Rlogo_77h124w.png")
par3d(userMatrix = rotationMatrix(45*pi/180, 0, 0, 1), windowRect=c(0,0, 101, 77))
rgl.snapshot("Rlogo45_77h124w.png")
library(png)
add.alpha <- readPNG("Rlogo_77h124w.png") #Try a rotate version, too

library(abind)
add.alpha <- abind(add.alpha, matrix(1, nrow=nrow(add.alpha), ncol=ncol(add.alpha)))

add.alpha[,,4][which(rgb(add.alpha[,,1],add.alpha[,,2],add.alpha[,,3]) == "#FF00FF")] <- 0
writePNG(add.alpha, "Rlogo_77h124w_alpha.png")
open3d(); bg3d(color="#FF69B4"); rgl.pop("lights"); light3d(specular="black") 
persp3d(x1,y1,z, col=col.mat2, axes=FALSE,
     ylab="", xlab="", zlab="", smooth=FALSE, aspect="iso")
view3d(zoom=.862)
par3d(userMatrix = rotationMatrix(-45*pi/180, 0, 0, 1), windowRect=c(0,0, width, height)) # width and height from trigonometry above
rgl.snapshot("Rlogo45_77h124w.png")
#library(png)
add.alpha <- readPNG("Rlogo45_77h124w.png") # Try "Rlogo_77h124w.png", too
#library(abind)
add.alpha <- abind(add.alpha, matrix(1, nrow=nrow(add.alpha), ncol=ncol(add.alpha)))

add.alpha[,,4][which(add.alpha[,,1] > .9 & add.alpha[,,3] > .9 & add.alpha[,,2] < .85 )] <- 0 # not a perfect solution
writePNG(add.alpha, "Rlogo45_77h124w_alpha.png")