2013-03-26 145 views
1

我有一个不同的十六进制颜色(> 6500)的巨大列表,我想删除非常暗的颜色和非常明亮的颜色。过滤器十六进制颜色

我该怎么做? 在明亮和黑暗的十六进制颜色代码中,我可以用它来过滤它们吗?我是否需要将它们转换为整数..?

谢谢!

+1

见http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color – 2013-03-26 15:30:24

+0

如果所有3组的2号低,颜色会变暗 – gaynorvader 2013-03-26 15:31:33

+2

您可以[将RGB转换为HSL](http://stackoverflow.com/questions/2348597/why-doesnt-this-javascript-rgb-to-hsl-code-work) – jantimon 2013-03-26 15:31:46

回答

1

这是可能做一个快速和肮脏方法:

独立的十六进制颜色转换为R/G/B字节。

将十六进制字节转换为十进制数,将它们加在一起除以3得到平均“亮度”的粗略想法。

选择您希望颜色在0到255的最大可能范围内的亮度的上限和下限,并排除任何超出这两个限制的颜色。

E.G.

#FFBBAA => FF BB AA =>(255 + 187 + 170)/ 3 = 204

如果决定200的 “亮度” 的上限,这种颜色过于鲜艳。你设定的限制完全是主观的,这取决于你。

如果您对以十六进制直接进行计算感到满意,则可以将转换完全跳过到十进制并将所有计算保留为十六进制。

1

此函数使用正则表达式来解析字符串值并将亮度从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://jsfiddle.net/L7PqT/

相关问题