Найти цветовой диапазон - PullRequest
1 голос
/ 05 августа 2009

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

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

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

Имеет смысл?

Я использую PHP

Ответы [ 2 ]

4 голосов
/ 06 августа 2009

Алгоритм, который вы объясняете, в основном: «Цвет состоит из двух компонентов 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 (Hue, Saturation, Value) и затем сказать, что цвет похож, если любой из компонентов H, S или V находится на +/- 10 шагах от вашего оригинала.

Например:

rgb (255 100,0) => hsv (24 100 100)

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

0 голосов
/ 05 августа 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) {
   .
   .
   .
}

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

...