#c# #.net #colors #color-scheme
#c# #.net #Цвет #цветовая схема
Вопрос:
Мне нужна помощь в цветовой математике. У меня есть один основной цвет, и мне нужно получить другие цвета выбранной гармонии. Мне нужны такие цветовые гармонии: триада, дополнение, аналогичная, монохроматическая. Они нужны мне в C #. Любая помощь приветствуется. Спасибо, Дима.
Комментарии:
1. Возможно, вы получите больше ответов, если дадите нам несколько определений нужных вам гармоний. Таким образом, отвечающим нужно знать только C #, а не C # и цветовые гармонии. 🙂
2. Я думал, что дам вам определения цветовых гармоний: триада, дополнение, аналогичная, монохроматическая. Или я что-то упускаю?
3. @пользователь604790. Это не определения, это просто список различных цветовых гармоний. Я хотел, чтобы вы включили объяснение того, что такое триада, что такое дополнение, что такое аналог и что такое монохроматический.
4. вот ссылка, где это объясняется: tigercolor.com/color-lab/color-theory/color-theory-intro.htm
Ответ №1:
Хорошо, все вращается вокруг цветового круга, описанного в вашей ссылке. Я предлагаю жестко закодировать эти цвета в массив. Я предполагаю, что ваш основной цвет всегда один из этих 12.
Нам понадобится вспомогательный метод, который будет обтекать значения массива таким образом, чтобы цвет -1 становился цветом 12 (индекс 11 в массиве):
int WrapColor(int colorIndex, int numWheelColors)
{
while(colorIndex < 0)
{
colorIndex = numWheelColors;
}
colorIndex = colorIndex % numWheelColors;
}
Нам также нужен вспомогательный метод, который получит индекс цвета на цветовом круге:
int GetColorWheelIndex(Color color)
{
if (ColorWheelArray.Contains(color))
return ColorWheelArray.IndexOf(color);
else
throw new InvalidArgumentException("color");
}
Теперь все на месте (предполагая, что у вас есть массив с именем ColorWheelArray, содержащий цвета по порядку).
Triada:
Color[] GetTriadaColors(Color color)
{
int colorIndex = GetColorWheelIndex(color, ColorWheelArray.Length);
return new Color[]
{
color,
ColorWheelArray[WrapColor(colorIndex ColorWheelArray.Length / 3)],
ColorWheelArray[WrapColor(colorIndex 2 * ColorWheelArray.Length / 3)]
};
}
Комплимент:
Color GetComplimentColor(Color color)
{
int colorIndex = GetColorWheelIndex(color, ColorWheelArray.Length);
return ColorWheelArray[WrapColor(colorIndex ColorWheelArray.Length / 2)];
}
Аналогичный:
Color[] GetAnalogousColors(Color color)
{
int colorIndex = GetColorWheelIndex(color, ColorWheelArray.Length);
return new Color[] { color,
ColorWheelArray[WrapColor(colorIndex 1)],
ColorWheelArray[WrapColor(colorIndex 2)] };
}
Поскольку я не знаю определения монохроматического, я оставляю это вам. 🙂
РЕДАКТИРОВАТЬ: Если вы хотите, чтобы это работало с любым цветом, то я не уверен на 100%, однако у меня есть идея.
На этом сайте говорится, что колесо создается путем выбора цветов в цветовом пространстве RYB (не в том RGB, которое использует C #). Итак, предположительно, вы могли бы определить, насколько «далек» ваш цвет от каждого из цветов на круге (путем преобразования обоих в RYB и сравнения), затем использовать мои функции для получения другого цвета (ов). Наконец, добавьте разницу между вашим цветом и ближайшим цветом колеса (в цветовом пространстве RYB) к каждому результату, окончательно переведя обратно в RGB для сохранения в качестве цветового объекта.
Комментарии:
1. Спасибо за помощь, это здорово. Но нужно найти цветовую гармонию для каждого цвета, который я даю, а не только для 12. Спасибо
2. Тогда вам нужно будет дать мне больше для продолжения. На этой странице не показано, как это сделать для других цветов. Также смотрите Мою правку внизу ответа.
3. Я тоже не знаю, поэтому я задаю этот вопрос в StackOverflow.
4. Хорошо, хорошо, я думаю, если не появится кто-то, кто случайно знает теорию цвета, вам, возможно, придется согласиться с моей правкой в нижней части моего ответа. Вы могли бы попробовать задать вопрос о graphicdesign.stackexchange.com тогда, если вы можете получить хорошее объяснение, тогда кто-нибудь здесь мог бы помочь с фактическим кодом.
5. Хорошо, у меня нет времени делать это за вас, но чтобы сделать то, что вы хотите, вам нужно преобразовать цвет RGB в цветовое пространство CIELCH, затем выполнить преобразование, описанное в URL выше, затем перевести обратно в RGB. Я не смог найти много информации о переводе с RGB на CIELCH и обратно, потому что RGB зависит от устройства. Я нашел ссылку на электронную таблицу Excel, которая делает это с использованием формул, так что вы могли бы взглянуть на это, чтобы разобраться. Как только это будет сделано, возврат цветов на основе изменения основного цвета должен быть простым. ccc.orgfree.com