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


person crono    schedule 29.12.2008    source источник
comment
Отправьте образец кода, который показывает, что вы пытаетесь сделать.   -  person Jay Bazuzi    schedule 29.12.2008
comment
См. stackoverflow.com/questions / 10254022 /, где этот вопрос обсуждается более подробно.   -  person Scott Burns    schedule 08.05.2015
comment
отличный вопрос! Ваш метод ColourMixer мне тоже очень помог!   -  person K-Dawg    schedule 13.02.2016


Ответы (2)


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

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

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

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

person Jason Cohen    schedule 29.12.2008
comment
Идея многообещающая, но как мне смешать два цвета после преобразования их в LAB? См. Мой вопрос: stackoverflow.com/q/14819058/240324 - person Tamás Pap; 11.02.2013
comment
@TamasPap Точно так же, как вы смешиваете любые другие количества. Например, усредните их компоненты вместе. - person Quuxplusone; 11.02.2013

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

person Bart    schedule 29.12.2008
comment
Это не так, у WIC есть COM-интерфейс, доступный в любой версии .NET. - person Marek; 22.01.2010