6

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

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

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

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

让事情变得过于复杂,假设蓝色对象比黄色对象大(为了论证,假设比例是 2:1),我添加的蓝色是黄色的两倍 - 我如何计算这个新的(浅绿色)颜色正确。

我了解 LAB * 颜色空间对于这种“自然颜色”之类的东西很有用,但我不确定如何使用它——尤其是在 cocos2d 对象的上下文中,该对象(AFAIK)仅限于在其中使用 RGB配色方案。

我非常感谢有关如何实现这一点的实际帮助。多谢!

21/4 更新:所以在 LAB* blue+yellow ≠ green 中(当您看到它们位于同一通道的两端时,这是有道理的)。稍微 讨论一下 SO,实际上是一个相当棘手的问题。似乎最终的答案是使用一个名为 Krita 的开源软件使用的 Kubelka-Munk 方法。我在任何地方都找不到(公式或代码本身)。

这个问题一个链接,它使用 HSL 以类似的方法进行绘画。我会尝试看看它是否有效,我会在这里反馈结果。

与此同时,如果有人知道如何实现 Kubelka-Munk或者我可以在哪里找到代码来执行此操作,或者其他解决方案,我会非常非常激动!

4

5 回答 5

6

没有混合蓝色和黄色产生绿色的颜色模型。自己试试水粉画,唯一有效的方法是青色和黄色。这就是为什么您应该尝试从 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)

于 2012-04-13T14:33:20.113 回答
2

我认为,值得尝试 HSL 色彩空间。添加颜色时,我们会插入它们的色调值(甚至考虑到物体的权重)。如果颜色为 100% 饱和度,则亮度和饱和度值将相等。

于 2012-04-13T13:22:16.530 回答
2

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

如果您想获得类似于人眼的结果,请在尝试混合颜色时忘记 RGB 数学

于 2012-04-13T11:47:48.757 回答
1

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

尽管染料有时会很棘手,但油漆更糟糕。油漆中含有反射粒子,一些照射到油漆表面的光会被它击中的第一个粒子反射回表面;在这方面,它们像加色一样混合。例如,如果油漆含有 20% 的绿色颗粒,那么无论它可能包含什么其他颜色,都会反射大量的绿光。另一方面,一些照射到涂漆表面的光会反弹并击中多个粒子。如果这些粒子中的任何一个吸收了某种颜色的光子,则该光子将不会被反射。在这方面,油漆的行为更像是减色。在实践中,油漆的行为有点像加色,有点像减色,

于 2012-06-11T22:28:19.240 回答
0

实际上,转换 RGB->XYZ->LAB 似乎与 RGB->LAB 完全一样

于 2013-10-14T08:34:33.103 回答