2016-04-19 4 views
0

создать два цвета следующим образом:Вычислить «сумму» два RGB цветов

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

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

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

ответ

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

Кажется, вы также можете заменить 'strtoi' 'col2rgb (c (красный, синий), TRUE) и продолжить оттуда –

1

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

1

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

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

+0

Это, кажется, не дает ожидаемый результат - спасибо за указатель, хотя. – assylias

Смежные вопросы