Найти цветовой диапазон

Я хочу найти диапазон цветов из значения одного значения RGB

Если бы мне дали, например, rgb (0,100,200), он дал бы мне все между rgb (0,0,255) и rgb (0,255,255). Однако не rgb (255,0,255).

Аналогично rgb (150,50,0). Возврат: rgb (255,0,0) и rgb (255,255,0). Не rgb (255,0,255).

Придать смысла?

Я использую PHP


person Ben Shelock    schedule 05.08.2009    source источник
comment
Вам нужно будет более конкретно указать, как следует определять границы диапазона.   -  person Amber    schedule 05.08.2009


Ответы (2)


Алгоритм, который вы объясняете, в основном таков: «Цвет состоит из двух компонентов RGB. Пусть самый сильный компонент RGB будет S, а другой компонент O. Создайте 255 вариантов, где вы позволяете S быть (255), а O - в диапазоне от 0 до 255».

Например. все приведенные ниже примеры дают одинаковый результат:

a) rgb(0,100,200) 
b) rgb(0,199,200)
c) rgb(0,254,255)
d) rgb(0,1,2)

Result: rgb(0,[0-255],255)

Это означает, что у вас всего 6 вариантов.

  1. Красный - самый большой компонент, зеленый - следующий по величине => rgb (255, [0-255], 0)
  2. Красный - самый большой компонент, Синий - следующий по величине => rgb (255,0, [0-255])
  3. Зеленый - самый большой компонент, красный - следующий по величине => rgb ([0-255], 255,0)
  4. Зеленый - самый большой компонент, Синий - следующий по величине => rgb ([0-255], 0,255)
  5. Синий - самый большой компонент, Красный - следующий по величине => rgb ([0-255], 0,255)
  6. Синий - самый большой компонент, зеленый - следующий по величине => rgb (0, [0-255], 255)

Намерение вашего алгоритма неясно, поэтому я предполагаю, что ваш вариант использования на самом деле отличается от того, что вы объясняете. Он не обрабатывает цвета с 1 или 3 компонентами (на самом деле большинство цветов).

Если ваша цель - найти похожие цвета (например, цвет на определенном расстоянии), есть подходы лучше. Например, вы можете преобразовать свои цвета в цветовое пространство HSV (оттенок, насыщенность, значение), а затем сказать, что цвет аналогичен, если любой из компонентов H, S или V находится на +/- 10 шагов от исходного.

E.g.:

RGB (255,100,0) => HSV (24,100,100)

Ваш диапазон тогда hsv ([14-34], [90-110], [90-110])

person Dan Gøran Lunde    schedule 06.08.2009

Хм, не уверен, что я правильно это понимаю, но я думаю, вы говорите, что одно из чисел выше двух других, и одно из значений всегда равно нулю. В этом случае вы сможете использовать простой оператор if-else, похожий на

if (r > g && r > b) {
  if (g > 0) {
    color1 = rgb(255, 0, 0);
    color2 = rgb(255, 255, 0);
  }
  else {
    color1 = rgb(255, 0, 0);
    color2 = rgb(255, 0, 255);
  }
}
else if (r < g && g > b) {
   .
   .
   .
}

Надеюсь, это поможет вам решить вашу проблему.

person a_m0d    schedule 05.08.2009