Есть ли способ найти дополнение цвета, учитывая его значения RGB? Или его можно найти только для определенных цветов? Как кто-то будет делать это на Java?
Программно найти дополнение цветов?
Ответ 1
Это вопрос, который может иметь неожиданную глубину, в зависимости от того, для чего вам это нужно. Если вы просто пытаетесь создать нечто более или менее похожее на дополнение к цвету ввода, оно довольно тривиально, используя простую математику. Если вы хотите, чтобы он был как можно ближе (так что вы фактически получаете нейтральный серый цвет при смешивании цвета), тогда вам нужно будет иметь дело с цветовыми пространствами, гамма и остальной калиброванной цветовой гаммой.
Кстати, я не знаком с термином "дополнение цвета" - что вы подразумеваете под этим?
Ответ 2
комплемента
Как рассчитать дополнительный цвет (PHP): http://www.serennu.com/colour/rgbtohsl.php
Реализация Javascript: Функция JS для вычисления дополнительного цвета?
Дополнение
(не удалось найти техническое определение)
Ответ 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 в шестнадцатеричные.
Ответ 8
Вы можете найти более подробную информацию по адресу: Программно выбирать высококонтрастные цвета
public static int complimentaryColour(int colour) {
return ~colour;
}
Ответ 9
он должен быть просто математическим
общее значение r для двух цветов должно быть 255
общее значение g для двух цветов должно быть 255
общее значение b значений двух цветов должно быть 255