计算"总和"两种RGB颜色

时间:2016-04-19 15:01:37

标签: r rgb alpha overlap

我按如下方式创建两种颜色:

red  <- rgb(140, 35, 35, alpha=255, max=255)
blue <- rgb(35, 35, 140, alpha=0.6*255, max=255)

如何创建通过重叠&#34;透明&#34;获得的新颜色?红色的蓝色?

我看到this answer但是(a)我不知道如何将它应用于rgb对象,(b)我希望有一种内置的方法来实现它。

3 个答案:

答案 0 :(得分:1)

我不知道内置方式,但你可以将字符串分解回原始组件 - strtoi(x = substr(red,2,3), base = 16) + ...

答案 1 :(得分:1)

我不知道是否有内置方式。我假设您想要某种“混合”(即加权平均值,可能使用您链接到的页面中的方法)而不是“总和”,因为添加在r-help上有类似的问题,其中更精通颜色的人指出,还有其他颜色空间,混合颜色可以提供更明智的效果。 Duncan Murdoch建议的方法是转换为hsv-colorspace,并让colorRampPalette通过选择在这两个“点”的位置绘制的线的中点来进行“平均”:

# Average the 1st two by taking the middle colour of a 3 colour palette
x <- colorRampPalette(c(red,blue), space = "Lab")(3)[2]
x
[1] "#6C1F57"
> red
[1] "#8C2323FF"
> blue
[1] "#23238C99"

由于这只返回三个颜色值而没有alpha,您可能需要单独处理它。我不是一个有颜色知识的用户,所以我不能就此事提出建议。

答案 2 :(得分:1)

基于TheComeOnMan answer,我想出了这个似乎做我需要的小功能:

overlap <- function(under, over) {
  r1 <- strtoi(substr(under, 2, 3), base = 16)
  r2 <- strtoi(substr(over, 2, 3), base = 16)
  g1 <- strtoi(substr(under, 4, 5), base = 16)
  g2 <- strtoi(substr(over, 4, 5), base = 16)
  b1 <- strtoi(substr(under, 6, 7), base = 16)
  b2 <- strtoi(substr(over, 6, 7), base = 16)
  a  <- strtoi(substr(over, 8, 9), base = 16) / 255 # alpha

  result <- rgb(a * r2 + (1 - a) * r1,
                a * g2 + (1 - a) * g1,
                a * b2 + (1 - a) * b1,
                alpha = 255,
                max=255)
  return(result)
}