Программно найти дополнение цветов? - PullRequest
11 голосов
/ 16 июня 2010

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

Ответы [ 9 ]

7 голосов
/ 16 июня 2010

Дополнение

Как рассчитать дополнительный цвет (PHP): http://www.serennu.com/colour/rgbtohsl.php

Реализация Javascript: Функция JS для вычисления дополнительного цвета?

Приложение

(не удалось найти техническое определение)

4 голосов
/ 16 июня 2010

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

2 голосов
/ 07 июня 2016

Вот что я приду: (Гипотеза)

Пусть 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.color-hex.com), но я все равно докажу это. :)

1 голос
/ 16 июня 2010

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

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

0 голосов
/ 13 января 2018

Вы можете найти больше информации по адресу: Программно выбирайте высококонтрастные цвета

public static int complimentaryColour(int colour) {
    return ~colour;
}
0 голосов
/ 30 сентября 2016

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

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

Наконец, конвертируйте обратно в RGB.

Я написал реализацию JavaScript с использованием шестнадцатеричного значения здесь - https://stackoverflow.com/a/37657940/4939630

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

0 голосов
/ 29 июля 2016

Просто фокусируемся на кубе 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())
0 голосов
/ 06 ноября 2015

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

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]);
}
0 голосов
/ 16 июня 2010

это просто математика

сумма значений r двух цветов должна составлять 255

сумма значений 2 цветов должна составлять 255

сумма значений b двух цветов должна составлять 255

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...