Вычислить сумму двух цветов RGB

Я создаю два цвета следующим образом:

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

Как создать новый цвет, который получается путем наложения «прозрачного» синего на красный?

Я видел этот ответ, но (а) я не знаю, как применить его к объекту rgb, и (б) я надеялся, что есть встроенный способ сделать это.


person assylias    schedule 19.04.2016    source источник


Ответы (3)


Я не знаю встроенного способа, но вы можете просто разбить строку символов обратно на исходные компоненты - strtoi(x = substr(red,2,3), base = 16) + ...

person TheComeOnMan    schedule 19.04.2016

Не знаю, есть ли встроенный способ. Я предполагаю, что вам нужно какое-то «смешение» (т.е. средневзвешенное значение, возможно, с использованием методов на странице, на которую вы ссылаетесь), а не «сумму», поскольку добавление. Аналогичный вопрос был по r-help, где более разбирающиеся в цвете люди отметили, что есть другие цветовые пространства, в которых смешивание цветов дает более ощутимые результаты. Метод, который предложил Дункан Мердок, состоял в том, чтобы преобразовать в 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"

Поскольку это возвращает только трехцветное значение, а не альфа-канал, вы можете обработать это отдельно. Я не разбираюсь в цвете, поэтому не могу дать совет по этому поводу.

person IRTFM    schedule 19.04.2016
comment
Похоже, это не дает ожидаемого результата - хотя спасибо за указатель. - person assylias; 19.04.2016

Основываясь на ответе TheComeOnMan, я придумал эту небольшую функцию, которая, кажется, делает то, что мне нужно:

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)
}
person assylias    schedule 19.04.2016
comment
Также кажется, что вы можете заменить strtois на col2rgb(c(red, blue), TRUE) и продолжить оттуда - person alexis_laz; 20.04.2016