首页 > 解决方案 > 如何删除在 R 中使用 png() 创建的图像周围的边距

问题描述

我正在尝试使用 R 覆盖两个 PNG 图像(不透明)。为此,我的逻辑如下:我使用readPNG(). 然后,我添加了一个 alpha 通道abind(),例如,0.5为了使图像半透明,我设置为使用该通道。到目前为止,所有这些都运行良好,我的问题是,当我使用png()输出图像覆盖图像时,会有白边。这总是会发生,即使我已将边距设置为0using par()。我错过了什么?

请在下面找到一个最小的工作示例:

library("png") 
library("abind")

# Download two random pictures
pngURL1 <- "https://imgur.com/download/0ljEVEW"
pngURL2 <- "https://imgur.com/download/oShoMag"
download.file(pngURL1, "temp1.png", mode = "wb")
download.file(pngURL2, "temp2.png", mode = "wb")

# Load downloaded images and add alpha channel
img1 = readPNG("temp1.png")
img1 = abind::abind(img1, img1[,,1]) # add an alpha channel
img2 = readPNG("temp2.png")
img2 = abind::abind(img2, img2[,,1]) # add an alpha channel

# Make semi-transparent
img1[,,4] <- 0.5
img2[,,4] <- 0.5

# Create output image
png('test.png', width = 480, height = 360)
par(mar = c(0,0,0,0))
plot.new()
rasterImage(img1, 0, 0, 1, 1)
rasterImage(img2, 0, 0, 1, 1)
dev.off()

这将创建以下输出:带有不需要的边距的示例图像我想去掉边距,这样我只得到一个与我使用的输入图像具有完全相同尺寸的 PNG 图像。

非常感谢您的帮助!

标签: rimageimage-processingpng

解决方案


不需要的边距是轴范围计算的结果。默认情况下,轴范围超出数据范围 4%。xaxs要解决这个问题,您可以将yaxs参数设置pari-- 内部样式。

对于您的示例,它将是:

par(mar = c(0,0,0,0), xaxs="i", yaxs="i")

结果是: 示例 png 结果


推荐阅读