我想说我有这样的RGB值(例如在R中):
cols <- c("#CDE4F3","#E7F3D3","#F7F0C7","#EFCFE5","#D0D1E7")
有没有办法以编程方式派生另一组颜色,这是前者的黑暗版本?
它不一定是R。
答案 0 :(得分:15)
static string FirstMonth = DateTime.Today.AddDays(1 - DateTime.Today.Day).ToString("yyyy-MM-dd");
答案 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")
您可以尝试使用几种不同的颜色空间和其他调整选项,但默认情况下大多数情况下都适用。
要查看变暗在不同颜色空间中的效果,请考虑当我们在HCL或HLS中使相同颜色变暗时会发生什么:
HCL变暗的颜色看起来很灰,HLS变暗的颜色看起来过于明亮和多彩。但是,根据您的具体应用,您可能需要其中一种结果。
答案 2 :(得分:6)
这似乎比我第一次使用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)