有没有办法以编程方式使给定RGB值的颜色变暗?

时间:2015-05-13 15:50:18

标签: r colors rgb

我想说我有这样的RGB值(例如在R中):

cols <- c("#CDE4F3","#E7F3D3","#F7F0C7","#EFCFE5","#D0D1E7")

有没有办法以编程方式派生另一组颜色,这是前者的黑暗版本?

它不一定是R。

7 个答案:

答案 0 :(得分:15)

static string FirstMonth = DateTime.Today.AddDays(1 - DateTime.Today.Day).ToString("yyyy-MM-dd");

resulting plot

答案 1 :(得分:12)

该问题询问是否有以任何方式以编程方式使颜色变暗。问题在于有许多不同的方式,它们都会产生不同的结果。您获得的具体结果取决于所使用的特定算法和使用的颜色空间。

R包colorspace现在提供了一个内置函数,通过darken()函数使颜色变暗。此功能使用新的&#34;组合&#34;我们提出的颜色空间是HLS和HCL之间的混合。 (简而言之,在HCL空间中调整L,但通过绕过HLS调整C,同时保持H不变。)

要使用此功能,您需要安装colorspace的当前开发版本:

install.packages("colorspace", repos = "http://R-Forge.R-project.org")

然后,尝试以下方法:

# original colors
cols <- c("#CDE4F3", "#E7F3D3", "#F7F0C7", "#EFCFE5", "#D0D1E7")

# darken 20%
cols_d2 <- darken(cols, 0.2)

# darken 40%
cols_d4 <- darken(cols, 0.4)

# plot
pal <- function(col, border = "light gray") {
  n <- length(col)
  plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1), axes = FALSE,
       xlab = "", ylab = "")
  rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border)
}

par(mfrow = c(3, 1), mar = c(1, 0, 2, 0))
pal(cols); mtext("original")
pal(cols_d2); mtext("20% darker")
pal(cols_d4); mtext("40% darker")

enter image description here

您可以尝试使用几种不同的颜色空间和其他调整选项,但默认情况下大多数情况下都适用。

要查看变暗在不同颜色空间中的效果,请考虑当我们在HCL或HLS中使相同颜色变暗时会发生什么:

enter image description here

HCL变暗的颜色看起来很灰,HLS变暗的颜色看起来过于明亮和多彩。但是,根据您的具体应用,您可能需要其中一种结果。

答案 2 :(得分:6)

HSV值调整

这似乎比我第一次使用Munsell颜色(下图)更好。它仍然有点乱收(可能是因为我在混合包中指定了行和列中的颜色并且是否采用矩阵),但它有效:

cols.hsv = rgb2hsv(cols.rgb)
# adjust the "value" down to 80% of it's previous level
cols.hsv["v", ] = cols.hsv["v", ] * 0.8

cols.darker = cols
for (i in seq_along(cols)) {
    cols.darker[i] = hsv(cols.hsv[1, i], cols.hsv[2, i], cols.hsv[3, i])
}

par(mfrow = c(1, 2))
scales::show_col(cols)
scales::show_col(cols.darker)

孟塞尔

之前我没有使用munsell包,所以我可能会让它变得比它需要的更复杂,但是它有一个函数darker,即&#34;减少Munsell颜色的值为1。&#34;

困难的部分是转换。就像我所知,我们需要将你的十六进制颜色变为我们必须通过RGB的Munsell颜色。

cols <- c("#CDE4F3","#E7F3D3","#F7F0C7","#EFCFE5","#D0D1E7")
cols.rgb = col2rgb(cols)

library(munsell)
# munsell expects rgb colors in rows, not columns, and expects the
# values to be between 0 and 1, not 0 and 255
cols.m = rgb2mnsl(t(cols.rgb) / rowSums(t(cols.rgb)))

# make darker
darker.m = darker(cols.m)
# at least converting back to hex is one step!
darker.hex = mnsl2hex(darker.m)


# view the results
par(mfrow = c(2, 1))
scales::show_col(cols)
scales::show_col(darker.hex)

总的来说,我对此解决方案并不满意。它使颜色更暗,我在darker函数中找不到调整它的方法。

答案 3 :(得分:5)

是的。

你必须指明你要去哪里变暗或变亮。

以下是使用JavaScript完成的功能:https://css-tricks.com/snippets/javascript/lighten-darken-color/

function LightenDarkenColor(col, amt) {
    var usePound = false;
    if (col[0] == "#") {
        col = col.slice(1);
        usePound = true;
    }
    var num = parseInt(col,16);
    var r = (num >> 16) + amt;
    if (r > 255) {
      r = 255;
    }else if  (r < 0){ 
      r = 0;
    }
    var b = ((num >> 8) & 0x00FF) + amt;
    if (b > 255) {
      b = 255;
    }else if  (b < 0) {
      b = 0;
    }
    var g = (num & 0x0000FF) + amt;
    if (g > 255) {
      g = 255;
    }else if (g < 0) {
      g = 0;
    }
    return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}

希望它有所帮助, 欢呼声。

答案 4 :(得分:5)

实际上,您可以使用colorRampPalette()在基本图形中真正轻松地做到这一点。

只需使用您的初始颜色和黑色进行渐变,将其渐变为100,然后选择所需的“深多少”即可(1 =初始,100 =黑色)。

我通过一个简洁的小功能做到了这一点:

darker.col = function(color, how.much = 30){
  colorRampPalette(c(color, "black"))(100)[how.much]
}

plot(1:100, rep(1, 100), pch=16, cex=5, col=darker.col("royalblue", 1:100))

答案 5 :(得分:4)

这不是很好的代码。 Log.d(String tag, String message)包可能更友好

munsell

答案 6 :(得分:0)

这是对我有用的简单方法,并以与原始格式相同的格式返回颜色:

library(colorspace)

cols <- c("#CDE4F3","#E7F3D3","#F7F0C7","#EFCFE5","#D0D1E7")    
rgb(hex2RGB(cols)@coords * 0.8)