如何给PNG图片添加alpha值

13
有没有办法使 rasterGrob 对象部分透明,以添加alpha因子?我正在使用一个标志作为水印,在ggplot2绘图中通过插入png图像(作为rasterGrob)的annotation_custom实现。然而,与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值的方法无法工作:

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


1
4个步骤按照如下顺序:1)将图像读入数组"a"中;2)设置该数组的alpha通道(第四个切片);3)使用该数组创建一个rasterGrob;4)将grob传递给annotation_custom函数。 - baptiste
@baptiste 非常感谢,这样做起作用了!如果您将您的评论作为答案发布,我会将其标记为已接受。 - AnjaM
我只是总结了Roman的答案,你应该接受它。 - baptiste
1个回答

12

这是直接从ggplot2博客(作者:@baptiste)中摘取的。您可以在创建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 的过程。我在我的问题中添加了一个示例。仅仅用 pngob 替换 m 对我来说行不通,因为我会得到以下错误: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
@AnjaM,你尝试过按照我发布的示例操作吗?在你的编辑中,你没有调整alpha值(创建w是至关重要的)。 - Roman Luštrik
当我尝试通过将您示例中的“m”替换为包含我的徽标的“pngob”来创建“w”时,我会收到错误消息:“Error in pngob[, , 1]: wrong number of dimensions”。在控制台中键入“dim(pngob)”返回“NULL”。 - AnjaM
1
@AnjaM,您需要修改导入的PNG图像。仔细查看我发布的示例,您会注意到其中的区别。在“我的”示例中,我使用ggplot2调用中的rpatternGrob转换对象。这可以在之前完成,但不能在创建w之前完成。 - Roman Luštrik
1
@AnjaM,你所需要做的就是将“rpatternGrob”替换为“rasterGrob”。请看我的修改。 - Roman Luštrik
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接