【问题标题】:R: add alpha-value to png-imageR:将 alpha 值添加到 png-image
【发布时间】:2012-07-06 15:50:30
【问题描述】:

有没有办法让 rasterGrob-object 部分透明,然后给它添加一个 alpha 因子?我通过插入annotation_custom 的 png 图像(作为 rasterGrob)在ggplot2 图中使用徽标作为水印。不过,和annotate不同的是,alpha选项在这里不起作用,所以我想图像必须提前更改。

作为一个基于 baptiste 在他的博客中建议的简单示例,到目前为止,我是这样做的:

img.path <- readPNG("logo.png")
pngob <- rasterGrob(img.path)
qplot(1:10, rnorm(10), geom = "blank") +
    annotation_custom(pngob, xmin=6.8, xmax=Inf, ymin=1, ymax=Inf) +
    geom_point()

上面的例子完美运行。

但是,在控制台中输入 dim(pngob) 会返回 NULL。因此,下面关于如何设置alpha-value 的建议不起作用:

m <- pngob
w <- matrix(rgb(m[,,1],m[,,2],m[,,3], m[,,4] * 0.2), nrow=dim(m)[1])

这会返回错误Error in m[, , 1]: wrong number of dimensions

【问题讨论】:

  • 4 步,按以下顺序: 1) 将图像读入数组“a”; 2)设置这个数组的alpha通道(第4个切片); 3)用这个数组创建一个rasterGrob; 4)将grob传递给annotation_custom
  • @baptiste 非常感谢,它是这样工作的!如果您将评论作为答案,我会将其标记为已接受。
  • 我只总结了罗曼的回答;你应该接受它。

标签: image r


【解决方案1】:

直接来自@baptiste 的ggplot2 blog。创建w时可以调整alpha。

 library(png)
 library(gridExtra)
 m <- readPNG(system.file("img", "Rlogo.png", package="png"), FALSE)
 w <- matrix(rgb(m[,,1],m[,,2],m[,,3], m[,,4] * 0.2), nrow=dim(m)[1]) #0.2 is alpha


 qplot(1:10, rnorm(10), geom = "blank") +
      annotation_custom(xmin=-Inf, ymin=-Inf, xmax=Inf, ymax=Inf, 
         rpatternGrob(motif=w, motif.width = unit(1, "cm"))) +
      geom_point()

或者,如果您想要一张图片:

qplot(1:10, rnorm(10), geom = "blank") +
  annotation_custom(xmin=-Inf, ymin=-Inf, xmax=Inf, ymax=Inf, 
    rasterGrob(w)) +
  geom_point()

【讨论】:

  • 我不得不承认我并不是很了解w的创建过程。我在我的问题中添加了一个示例。简单地将m 替换为pngob 对我不起作用,因为我收到以下错误:Error in UseMethod("validGrob"): not applicable method for 'ValidGrob' onto the object of class "c('matrix', 'character')" applied. Additional warning: In editThisGrob(grob, spects): Slot 'vp' not found.(我翻译了错误文本,因此在英文版的 R 中可能不完全相同)
  • @AnjaM 您是否尝试过按照我发布的示例进行操作?在您的编辑中,您未能调整 alpha 值(创建 w 至关重要)。
  • @RomanLuštrik:当我尝试通过将m(来自您的示例)替换为pngob(包含我的徽标)来创建w 时,我收到错误:Error in pngob[, , 1]: wrong number of dimensions。在控制台中输入 dim(pngob) 会返回 NULL
  • @AnjaM 你需要修改导入的 png 图片。仔细看我贴的例子,你会注意到不同之处。在“我的”示例中,我在 ggplot2 调用中使用 rpatternGrob 转换对象。它本可以更早完成,但不是在创建 w 之前完成。
  • @AnjaM 您只需将rpatternGrob 替换为rasterGrob。查看我的编辑。
猜你喜欢
  • 2018-06-23
  • 2018-03-24
  • 2017-06-23
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多