我有一个不同的十六进制颜色(> 6500)的巨大列表,我想删除非常暗的颜色和非常明亮的颜色。过滤器十六进制颜色
我该怎么做? 在明亮和黑暗的十六进制颜色代码中,我可以用它来过滤它们吗?我是否需要将它们转换为整数..?
谢谢!
我有一个不同的十六进制颜色(> 6500)的巨大列表,我想删除非常暗的颜色和非常明亮的颜色。过滤器十六进制颜色
我该怎么做? 在明亮和黑暗的十六进制颜色代码中,我可以用它来过滤它们吗?我是否需要将它们转换为整数..?
谢谢!
这是可能做一个快速和肮脏方法:
独立的十六进制颜色转换为R/G/B字节。
将十六进制字节转换为十进制数,将它们加在一起除以3得到平均“亮度”的粗略想法。
选择您希望颜色在0到255的最大可能范围内的亮度的上限和下限,并排除任何超出这两个限制的颜色。
E.G.
#FFBBAA => FF BB AA =>(255 + 187 + 170)/ 3 = 204
如果决定200的 “亮度” 的上限,这种颜色过于鲜艳。你设定的限制完全是主观的,这取决于你。
如果您对以十六进制直接进行计算感到满意,则可以将转换完全跳过到十进制并将所有计算保留为十六进制。
此函数使用正则表达式来解析字符串值并将亮度从0(黑色)返回到1(100%白色)。
function hexBrightness(hex) {
var regExp = hex.length < 6 ? /^#(([a-f\d]))(([a-f\d]))(([a-f\d]))$/i : /^#([a-f\d])([a-f\d])([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i;
var result = regExp.exec(hex);
if (result) {
var r = parseInt("" + result[1] + result[2], 16),
g = parseInt("" + result[3] + result[4], 16),
b = parseInt("" + result[5] + result[6], 16),
max = Math.max(r, g, b),
min = Math.min(r, g, b),
l = (max + min)/2;
return l/255;
}
return null;
}
// Test
var assert = function (assertion, name) {
$("<p/>").appendTo(document.body).text(name + (assertion ? ' works' : ' fails'))
}
assert(hexBrightness('#FFFFFF') == 1, 'Uppercase');
assert(hexBrightness('#ffffff') == 1, 'Lowercase');
assert(hexBrightness('#fff') == 1, 'Short');
assert(hexBrightness('#000') == 0, 'Black');
assert(hexBrightness('invalid') == null, 'Invalid color');
见http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color – 2013-03-26 15:30:24
如果所有3组的2号低,颜色会变暗 – gaynorvader 2013-03-26 15:31:33
您可以[将RGB转换为HSL](http://stackoverflow.com/questions/2348597/why-doesnt-this-javascript-rgb-to-hsl-code-work) – jantimon 2013-03-26 15:31:46