Как смешивать цвета "естественно" с C #? - PullRequest
45 голосов
/ 29 декабря 2008

Я должен смешать несколько цветов естественным образом. Это значит

blue + yellow = green 
blue + red = purple

И так далее. Я получил цвета как RGB-значения. Когда я пытаюсь смешать их, я получаю правильные "RGB" результаты, такие как

green + red = yellow
yellow + blue = white

Но не правильные результаты "естественная влажная краска". Любая хорошая идея, как естественным образом смешать RGB?

Было бы замечательно, если бы кто-то знал решение в пространстве имен Microsoft.Xna.Framework.Graphics, но общее решение также помогло бы:)


@ Джей Базузи:

Пожалуйста, отправьте пример кода, который показывает что вы пытаетесь сделать.

Конечно - это моя функция для смешивания двух цветов RGB.

public Color colorMixer(Color c1, Color c2)
{

    int _r = Math.Min((c1.R + c2.R),255);
    int _g = Math.Min((c1.G + c2.G),255);
    int _b = Math.Min((c1.B + c2.B),255);

    return new Color(Convert.ToByte(_r),
                     Convert.ToByte(_g),
                     Convert.ToByte(_b));
}

То, что я до сих пор читал в этой теме, очень многообещающе - я преобразую C1 и C2 в L a b *, смешаю их - преобразую обратно в RGB и верну этот цвет.

Ответы [ 3 ]

46 голосов
/ 29 декабря 2008

«Натуральная мокрая краска» немного неоднозначна; микширование CMYK, как предлагается, не будет работать, потому что вы все еще добавляете цвета.

Если вы хотите получить результаты, как в Photoshop (как проверял Джон Б), вам нужно использовать пробел L * a * b *. Формулы для преобразования RGB в / из Lab и описание здесь .

Лабораторное пространство было специально разработано таким образом, чтобы линейные изменения соответствовали тому, что человеческий глаз воспринимает как определенное изменение цвета. Это важно, потому что, например, мы более чувствительны к зеленому, чем другие цвета, потому что мы по-разному воспринимаем изменения в зависимости от оттенка и яркости и т. д.

Попытка любых других методов, предлагаемых в настоящее время, приведет не только к цветам, которые вам не нужны, но также не будет представлять "постоянно выглядящее" изменение цвета, особенно если вы используете это для чего-то, где постоянные изменения имеют значение как градиент.

18 голосов
/ 29 декабря 2008

Есть хорошая статья для преобразования RGB в L a b в C # на http://www.codeproject.com/KB/recipes/colorspace1.aspx.

3 голосов
/ 29 декабря 2008

Вы получаете преобразование cmyk <-> rgb бесплатно с WIC . но это только .NET 3.0

...