2013-03-26 2 views
1

У меня есть огромный список разноцветных шестигранных цветов (> 6500), и я хочу удалить цвета, которые очень темные, и цвета, которые очень яркие.Фильтр Hex Цвета

Как я могу это сделать? Есть ли специфическая харахтеристика в ярких и темных цветовых кодах, которые я могу использовать для их фильтрации? Нужно ли преобразовывать их в целые числа?

Спасибо!

+1

См http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color –

+0

Если все 3 группы 2 являются малочисленность , цвет будет темным – gaynorvader

+2

Вы можете [конвертировать RGB в HSL] (http://stackoverflow.com/questions/2348597/why-doesnt-this-javascript-rgb-to-hsl-code-work) – jantimon

ответ

1

Это быстрый и грязный метод, который мог бы сделать:

Раздельное ваш Hex цвет в R/G/B байт.

Преобразуйте шестнадцатеричные байты в десятичные числа, добавьте их вместе и разделите на 3, чтобы получить приблизительное представление о средней «яркости».

Выберите верхний предел и нижний предел того, насколько ярким вы хотели бы, чтобы ваши цвета находились в пределах максимально возможного диапазона от 0 до 255 и исключали любые, которые находятся за пределами этих двух пределов.

E.G.

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

Если вы решили 200 ваш верхний предел "яркости", этот цвет слишком яркий. Установленные вами пределы полностью субъективны, так что до вас.

Если вам удобно выполнять вычисления в Hex напрямую, вы можете пропустить преобразование в десятичное целое и сохранить все вычисления в Hex.

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/

Смежные вопросы