像油漆一样添加颜色(颜色)(蓝色+黄色=绿色等)

时间:2012-04-13 11:17:54

标签: c++ objective-c math colors cocos2d-iphone

我正在使用cocos2d库制作iOS游戏。

假设您有两个具有两种不同颜色的对象 - 以RGB格式定义为

Blue:    0,0,255
Yellow:  255,255,0

我想添加蓝色和黄色以制作绿色。

为了使事情变得复杂,让我们说Blue对象比Yellow对象大(为了说明,我们说比例为2:1),我加入的蓝色是黄色的两倍 - 如何我正确地计算了这种新的(浅绿色)颜色。

我理解LAB *色彩空间对于这种“自然色”有用,但我不知道如何使用它 - 特别是在cocos2d对象的上下文中(AFAIK)仅限于使用RGB的配色方案。

我非常感谢如何实现这一目标的实际帮助。谢谢堆!

21/4更新:所以在LAB *中蓝色+黄色≠绿色(当你看到they're at opposite ends of the same channel时这是有意义的)。关于SO的little bit讨论实际上是一个非常棘手的问题。似乎最终的答案是使用Kubelka-Munk方法,即一种名为Krita的开源软件。我找不到任何地方(公式或代码本身)。

This questiona link,它使用HSL以类似的方式绘制。我将尝试查看它是否有效,我将在此处反馈结果。

在此期间 if anyone knows how to implement Kubelka-Munk 或者我可以找到执行此操作的代码或其他解决方案,我会非常非常激动!

5 个答案:

答案 0 :(得分:5)

没有颜色模型,混合蓝色和黄色使绿色。用水粉自己尝试一下,它唯一的工作方式是青色和黄色。这就是为什么你应该尝试从RGB切换到CMYK,如果需要,可以返回。以下是它的完成方式

void toCMYK(float red, float green, float blue, float* cmyk)
{
  float k = MIN(255-red,MIN(255-green,255-blue));
  float c = 255*(255-red-k)/(255-k); 
  float m = 255*(255-green-k)/(255-k); 
  float y = 255*(255-blue-k)/(255-k); 

  cmyk[0] = c;
  cmyk[1] = m;
  cmyk[2] = y;
  cmyk[3] = k;
}

void toRGB(float c, float m, float y, float k, float *rgb)
{
  rgb[0] = -((c * (255-k)) / 255 + k - 255);
  rgb[1] = -((m * (255-k)) / 255 + k - 255);
  rgb[2] = -((y * (255-k)) / 255 + k - 255);
}

然后在您的代码中,混合青色和黄色

float cmyk1[4];
toCMYK(255, 255, 0, cmyk1);  // yellow

float cmyk2[4];
toCMYK(0, 255, 255, cmyk2);  // cyan

// Mixing colors is as simple as adding
float cmykMix[] = { cmyk1[0] + cmyk2[0], cmyk1[1] + cmyk2[1], cmyk1[2] + cmyk2[2], cmyk1[3] + cmyk2[3] };

float rgb[3];
toRGB(cmykMix[0], cmykMix[1], cmykMix[2], cmykMix[3], rgb);  

NSLog(@"RGB mix = (%f, %f, %f)", rgb[0], rgb[1], rgb[2]);

运行代码将产生:RGB mix = (0.000000, 255.000000, 0.000000)

答案 1 :(得分:2)

检查此网站上的公式:http://www.easyrgb.com/index.php?X=MATH 我一直在做类似的事情,它可以通过转换RGB-> XYZ-> Lab来实现。然而,计算非常昂贵(如果你为很多像素做这件事)。

如果想要获得类似于人眼的结果

,请在尝试混合颜色时忘记RGB数学

答案 2 :(得分:2)

我认为,值得尝试HSL色彩空间。添加颜色时,我们插入其Hue值(甚至考虑对象权重)。如果颜色为100%饱和度,则亮度和饱和度值将相等。

答案 3 :(得分:1)

染色在现实世界中不起作用,就像减色模型所暗示的那样。用于CYMK印花的染料非常接近,因为它们是为此目的而配制的,但许多由天然物质制成的染料可能表现得有些奇怪。困难在于,虽然白光被认为是红色,绿色和蓝色的组合,但它实际上由许多不同的波长组成 - 字面意思是“彩虹的所有颜色” - 每一个都会刺激红色,绿色,不同量的眼睛和蓝色受体。实际上看起来相同的两种颜色实际上可能包含不同的波长组合;同样,当在白光下观察时,两种染料可能看起来相同,但吸收不同的波长组合。当单独使用时,这些染料可能看起来彼此相同,但当与其他东西结合使用时,可能会产生非常不同的看似结果。

虽然染料有时会很棘手,但涂料更糟糕。涂料含有反射颗粒,撞击涂漆表面的一些光线会被撞击的第一个颗粒从表面反射回来;在这方面,它们混合了加色。例如,如果涂料含有20%的绿色颗粒,则无论其可能包含的其他颜色如何,都会反射大量的绿光。另一方面,撞击涂漆表面的一些光会反弹并撞击多个粒子。如果这些粒子中的任何一个吸收某种颜色的光子,那么该光子就不会被反射。在这方面,涂料表现得更像减色。在实践中,涂料的表现有点像加色,有点像减色,有时像古怪和古怪,完全不同。

答案 4 :(得分:0)

实际上似乎转换RGB-> XYZ-> LAB与RGB-> LAB

完全相同