计算两种RGB颜色的"sum"

Calculate the "sum" of two RGB colours

我创建两种颜色如下:

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

如何创建通过将 "transparent" 蓝色重叠在红色上获得的新颜色?

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

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

不知道有没有内置的方法。我假设你想要某种 "blend" (即加权平均值,可能使用你链接到的页面中的方法)而不是 "sum" ,因为添加 There was a similar question on r -帮助更多精通颜色的人指出还有其他颜色空间,其中混合颜色可提供更明智的结果。 Duncan Murdoch 建议的方法是转换为 hsv-colorspace 并让 colorRampPalette 通过选取穿过这两个 "points":

位置的线的中点来执行 "averaging"
# 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"

由于只有 returns 三色值且没有 alpha,您可能需要单独处理。我不是一个懂颜色的用户,所以我不能就这件事提出建议。

基于,我想出了这个似乎可以满足我需要的小功能:

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)
}