2013-03-26 150 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/

相關問題