我正在尝试找到一种基于%数量混合颜色的算法。我正在进行一个选举项目,并且希望能够在比赛中为每个候选人分配不同的颜色,然后根据候选人获得多少投票来创建“结果”颜色。
这个问题:
Is there an algorithm for color mixing that works like mixing real colors?
接近我要问的问题 - 但我可能需要将3种或4种或5种颜色混合在一起。我知道这最终是一个非常复杂的问题 - 但我很好奇建议的方法是用2种以上的颜色来做这件事。所以,我可能会:
红色(40%),绿色(10%),蓝色(50%)
OR
红色(40%),黄色(5%),蓝色(10%),橙色(45%)
再一次,我知道最后一个例子可能会产生某种灰色或棕色或黑色 - 这很好。我的问题是我甚至没有试图解决这个问题的算法。
编辑: 所以 - 在发布此消息后,我意识到我真正想要实现的基本上是PAINT颜色混合。换句话说,我不希望LIGHT颜色混合,我想模拟PAINT混合会发生什么 - 因为这是我一直“期待”的“可预测”结果 - 并且很难获得。
我找到了这个链接:http://painting.about.com/library/blpaint/blcolormixingpalette1.htm
与我正在努力完成的事情非常接近 - 并且在我最初的想法中暴露出一个小小的“缺陷”。所展示的是,即使我可以使用此算法混合多达6种颜色,实际的“数据”总是分解为3种基色。
即便如此 - 这非常接近。
感谢所有为此主题做出贡献的人 - 所有这些建议对于探索这个令人惊讶的复杂问题/领域非常有帮助。
答案 0 :(得分:6)
您是否尝试过简单地加权?
d.R = a.R*0.25 + b.R*0.25 + c.R*0.5
d.G = a.G*0.25 + b.G*0.25 + c.G*0.5
...
where a, b, c are the colors you're mixing
从我的研究来看,似乎没有任何一个正确的答案,但似乎产生最合适的效果。此外,我不认为简单地混合颜色会在infograph上显示任何内容。你最好尝试一些非常精细的抖动http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing
答案 1 :(得分:1)
这完全取决于color model中的原色。看起来你正在使用RGB color model,这意味着所有颜色都可以用红色,绿色和蓝色混合来表示。
也就是说,任何不红色,绿色或蓝色的颜色都会将它们分解为红色,绿色和蓝色对应物,然后将这些权重乘以整体重量。
在你的第二个例子中:
红色(40%),黄色(5%),蓝色(10%),橙色(45%)
黄色和橙色需要分解。假设你有橙色的Color
实例,你可以这样做:
orangeRed = o.R * .05;
orangeBlue = o.B * .05;
orangeGreen = o.G * .05;
这实际上可以在所有 Color
个实例中进行推广(对于原色,R
,G
和B
中只有一个会有一个值)然后可以得到总和和加权平均值来得到你的混合颜色。
执行此操作的简单扩展方法是:
static Color Mix(this IEnumerable<Tuple<Color, double>> colors)
{
// The red, green, and blue values.
double red = 0.0, green = 0.0, blue = 0.0;
// The denominator for the weighted average for a color.
double denominator = byte.MaxValue * 3.0;
// Cycle through the colors.
foreach (Tuple<Color, double> color in colors)
{
// Get the weighted average value for each component, and then
// multiply that by the weight for the color.
red += ((color.Item1.R / denominator) * color.Item2);
green += ((color.Item1.G / denominator) * color.Item2);
blue += ((color.Item1.B / denominator) * color.Item2);
}
// Create the color and return.
return Color.FromArgb((int) red, (int) green, (int) blue);
}
答案 2 :(得分:1)
RGB颜色系统对于这样的计算是不好的,因为它不像我们人类感知颜色那样工作。例如,我们只是将黄色视为绿色和红色的混合物。 第一步是在颜色空间中转换颜色,其中您有一个亮度坐标和两个颜色坐标。 这可以是HLS或CIELAB。 HLS转换更简单,但CIELAB中的坐标代表了更好的人体色彩体验。该色彩空间中的相等距离在人类感知中至少大致相等。
在此颜色空间中,您有L,A和B的坐标。对于所有颜色,L应该相同。您的基色应该位于灰点周围的圆上,因此它们具有相同的距离,并且没有颜色比其他颜色更强。所以你基本上在飞机上有几个点,需要计算这些点的加权中点。您将此点转换回RGB。