2015-07-02 5 views
0

мне удалось генерировать случайные шестнадцатеричный цвет из строки:сделать цвет краски гекса выглядит более интенсивным

function StringToColorFilter() { 
    var hashString = function (chaine) { 
     var hash = 0, i, chr, len; 
     if (chaine.length == 0) 
      return hash; 
     for (i = 0, len = chaine.length; i < len; i++) { 
      chr = chaine.charCodeAt(i); 
      hash = ((hash << 5) - hash) + chr; 
      hash |= 0; // Convert to 32bit integer 
     } 
     return hash; 
    }; 
    return function (chaine) { 
     return "#" + ("FFFFFF" + Math.abs(hashString(chaine) % 16777216).toString(16)).substr(-6); 
    }; 
} 

Пример:StringToColorFilter()("MyString") =>#393303(не везло этот цвет Suxx)

Итак, сейчас:

  • Я хочу избежать белым, мягким, поседения или бледных цветов
  • Я хочу генерировать только интенсивный/сильный/красочного цвет

Я первый попытался удалить один компонент (красный, зеленый, или синий) или два, но это удаляет слишком много возможностей, и я все еще могу иметь уродливые цвета.

Затем я попытался удалить значения экстремума (F/E и 0/1). Но я все еще могу быть серым.

Некоторые идеи алгоритма?

+2

Для интенсивного цвета вам может потребоваться преобразовать его в цветовое пространство «HSV» или «HSL», которое представляет компоненты хром, интенсивность и насыщенность отдельно. Таким образом, вы можете легче управлять насыщенностью и интенсивностью цвета. –

+0

Действительно! Хорошая идея ! =) –

+1

FYI, переход от 'RGB' к' HSV' назад и вперед может стоить некоторой потери в некоторой степени. Возможно, вам также придется об этом знать. –

ответ

0

Solution благодаря Tao P. R., Paul S.: Используя формат HSV и фиксирующие S и V.

В моем случае я использовал S = 0,59 и V = 0,87. Поэтому у меня есть только 360 цветов осталось, но этого достаточно для меня, и это решение убедитесь, что у меня есть одинаковое насыщенность и яркость по всем моим цветам.

function StringToColorFilter() { 
    var hashString = function (chaine) { 
     var hash = 0, i, chr, len; 
     if (chaine.length == 0) 
      return hash; 
     for (i = 0, len = chaine.length; i < len; i++) { 
      chr = chaine.charCodeAt(i); 
      hash = ((hash << 5) - hash) + chr; 
      hash |= 0; // Convert to 32bit integer 
     } 
     return hash; 
    }; 
    function HSVtoRGB(h, s, v) { 
     var r, g, b, i, f, p, q, t; 
     i = Math.floor(h * 6); 
     f = h * 6 - i; 
     p = v * (1 - s); 
     q = v * (1 - f * s); 
     t = v * (1 - (1 - f) * s); 
     switch (i % 6) { 
      case 0: 
       r = v, g = t, b = p; 
       break; 
      case 1: 
       r = q, g = v, b = p; 
       break; 
      case 2: 
       r = p, g = v, b = t; 
       break; 
      case 3: 
       r = p, g = q, b = v; 
       break; 
      case 4: 
       r = t, g = p, b = v; 
       break; 
      case 5: 
       r = v, g = p, b = q; 
       break; 
     } 
     return { 
      r: Math.floor(r * 255), 
      g: Math.floor(g * 255), 
      b: Math.floor(b * 255) 
     }; 
    } 
    return function (chaine) { 
     var couleur = HSVtoRGB(Math.abs(hashString(chaine) % 360)/360, 0.59, 0.87); 
     return "#" + ("FF" + couleur.r.toString(16)).substr(-2) + ("FF" + couleur.g.toString(16)).substr(-2) + ("FF" + couleur.b.toString(16)).substr(-2); 
    }; 
} 
Смежные вопросы