Программно найти дополнение цветов?

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

Ответ 1

Это вопрос, который может иметь неожиданную глубину, в зависимости от того, для чего вам это нужно. Если вы просто пытаетесь создать нечто более или менее похожее на дополнение к цвету ввода, оно довольно тривиально, используя простую математику. Если вы хотите, чтобы он был как можно ближе (так что вы фактически получаете нейтральный серый цвет при смешивании цвета), тогда вам нужно будет иметь дело с цветовыми пространствами, гамма и остальной калиброванной цветовой гаммой.

Кстати, я не знаком с термином "дополнение цвета" - что вы подразумеваете под этим?

Ответ 3

Дополнительно можно легко использовать класс HSL Color.

Ответ 4

Вот что я поднимаю: (гипотеза)

Пусть r, g и b - компоненты RGB исходного цвета.

Пусть r', g' и b' являются компонентами RGB дополнительного цвета.

Тогда:

r' = max(r,b,g) + min(r,b,g) - r   
b' = max(r,b,g) + min(r,b,g) - b
g' = max(r,b,g) + min(r,b,g) - g

Я вижу, что это дает тот же ответ на то, что дают веб-сайты (т.е. www.colorhehe.com), но я все равно это докажу.:)

Ответ 5

Ни один из вышеперечисленных ответов не дает способа найти бесплатный цвет, поэтому здесь моя версия написана в разделе Обработка:

import java.awt.Color;

color initial = color(100, 0, 100);

void setup() {
  size(400, 400);  

  fill(initial);
  rect(0, 0, width/2, height);

  color opposite = getOppositeColor(initial);
  fill(opposite);
  rect(width/2, 0, width/2, height);
}

color getOppositeColor(color c) {
  float[] hsv = new float[3];
  Color.RGBtoHSB(c>>16&0xFF, c>>8&0xFF, c&0xFF, hsv);
  hsv[0] = (hsv[0] + 0.5) % 1.0;

  // black or white? return opposite
  if (hsv[2] == 0) return color(255);
  else if (hsv[2] == 1.0) return color(0);

  // low value? otherwise, adjust that too
  if (hsv[2] < 0.5) {
    hsv[2] = (hsv[2] + 0.5) % 1.0;
  }

  return Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]);
}

Ответ 6

Просто сосредоточиться на кубе 3D RGB. Здесь функция, которая выполняет бинарный поиск в этом кубе, чтобы не пытаться выяснить, как отбрасывать векторы в направлении и находить ближайшую точку на границе куба, которая пересекает ее.

def farthestColorInRGBcubeFrom(color):
  def pathsAt(r, g, b):
    paths = [(r, g, b)]
    if r < 255:
        paths.append((int((r + 255)/2), g, b))
    if r > 0:
        paths.append((int(r/2), g, b))
    if g < 255:
        paths.append((r, int((g + 255)/2), b))
    if g > 0:
        paths.append((r, int(g/2), b))
    if b < 255:
        paths.append((r, g, int((b + 255)/2)))
    if b > 0:
        paths.append((r, g, int(b/2)))
    return paths                         
r = color.red();  g = color.green();  b = color.blue();
#naive guess:
r0 = 255 - r;  g0 = 255 - g;  b0 = 255 - b;
paths = pathsAt(r0, g0, b0)
maxPath = None
while paths != []:
    for p in paths:
        d = (r - p[0])**2 + (g - p[1])**2 + (b - p[0])**2
        if maxPath != None:
            if d > maxPath[0]:
                maxPath = (d, p)
        else:
            maxPath = (d, p)
    p = maxPath[1]
    paths = pathsAt(p[0], p[1], p[2])
c = maxPath[1]
return QColor(c[0], c[1], c[2], color.alpha())

Ответ 7

В грубом приближении вы можете сделать это, переведя RGB в HSL (Hue, Saturation, Lightness).

С помощью значения HSL сдвиньте оттенок на 180 градусов, чтобы получить цвет напротив цветного колеса от исходного значения.

Наконец, вернитесь к RGB.

Я написал реализацию JavaScript, используя здесь шестнадцатеричное значение - fooobar.com/questions/120609/...

Для RGB просто удалите шестнадцатеричные преобразования RGB и RGB в шестнадцатеричные.

Ответ 9

он должен быть просто математическим

общее значение r для двух цветов должно быть 255

общее значение g для двух цветов должно быть 255

общее значение b значений двух цветов должно быть 255