Как смешивать цвета "естественно" с C#?

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

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 в La b *, смешиваю их - конвертирую обратно в RGB и возвращаю этот цвет.

3 ответа

Решение

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

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

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

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

На http://www.codeproject.com/KB/recipes/colorspace1.aspx есть хорошая статья по конвертации RGB в L a b.

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

Другие вопросы по тегам