2012-04-13 171 views
6

我正在使用cocos2d庫製作iOS遊戲。像油漆一樣添加顏色(顏色)(藍色+黃色=綠色等)

比方說你有一個有兩個單獨的顏色的兩個對象 - RGB定義爲

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

我要添加藍色和黃色,使綠色。

要通過複雜的事情,讓我們說,藍對象比黃色物體較大(爲便於討論,讓我們說的比爲2:1),我加入兩倍的藍色作爲黃色 - 如何我正確計算這種新的(淺綠色)顏色。

我明白LAB *色彩空間對於這種'自然色'有用,但我不確定如何使用它 - 特別是在一個cocos2d對象的上下文中(AFAIK)僅限於在其配色方案中使用RGB。

我真的很感謝如何實現這一點的實際幫助。感謝堆!

21/4更新:所以在LAB *藍+黃綠色≠(這是有道理的,當你看到they're at opposite ends of the same channel)。關於SO的討論其實是一個棘手的問題。看起來最終的答案是使用一種名爲Krita的開源軟件使用的Kubelka-Munk方法。我找不到任何地方(公式或代碼本身)。

This questiona link它使用HSL工作在類似的方法來繪製。我會試着看看它是否有效,我會在這裏反饋結果。

與此同時if anyone knows how to implement Kubelka-Munk或在哪裏我可以找到代碼來做到這一點,或另一種解決方案,我會非常非常興奮!

+1

'藍+ Yellow'從來都不是'Green',但你要知道在幼兒園。這實際上指的是一個簡單的減色模型,如CMYK,其中'1 - 青 - 黃≈綠('青'藍)'。 – leftaroundabout 2012-04-13 11:23:54

回答

2

查看本網站上的公式:http://www.easyrgb.com/index.php?X=MATH 我一直在做類似的事情,它可以通過轉換RGB-> XYZ-> Lab來實現。然而,計算是相當昂貴的(如果你做了很多像素)。

,並試圖如果你想獲得類似於人眼效果混合顏色時,忘了RGB數學

+0

因此,objectA,objectB用RGB着色 - 將RGB轉換爲XYZ然後轉換爲LAB,將這兩種顏色加在一起,然後再將它們轉換回XYZ和RGB? – glenstorey 2012-04-13 23:37:58

+0

是的,因爲我寫了它需要大量的計算(我逐個像素地分析了整個圖像),但給出了不錯的結果 – 2012-04-16 07:16:40

+0

當您在LAB空間中添加兩種顏色時。這是如何正確完成的?僅L1 * 0.5 + L2 * 0.5,A1 * 0.5 + A2 * 0.5和B1 * 0.5 + B2 * 0.5 – Christoffer 2013-10-13 22:42:37

2

我覺得,這是值得嘗試HSL色彩空間。添加顏色時,我們插入他們的色調值(甚至考慮對象權重)。如果顏色是100%飽和,亮度和飽和度值將相等。

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)

+0

謝謝你的回答,尤其是代碼。我認爲這將適用於黃色加藍色 - 但我不知道它是否適用於其他顏色算術。我一直在做這方面的研究,並且像這樣的答案:http://stackoverflow.com/a/398268/459116使它看起來像LAB是最好的方式。 – glenstorey 2012-04-14 21:26:39

+0

我用黃色和藍色模型塗料做過,藍色是深藍色,不是「綠色」 - 絕對不是「青色」,結果絕對是綠色。印花染料不會發生這種情況,但很容易發生在塗料上,有時也會發生在染料上。 (有關更多信息,請參閱我的答案) – supercat 2012-06-11 22:30:12

1

染料不會在現實世界非常像減色模型表明。用於CYMK印刷的染料非常接近,因爲它們是爲此目的而配製的,但許多由天然物質製成的染料行爲有點奇怪。困難在於,雖然白光被認爲是紅色,綠色和藍色的組合,但它實際上由許多不同的波長組成 - 字面意思是「彩虹的所有顏色」 - 每種顏色都會刺激紅色,綠色,和不同量的眼睛中的藍色受體。實際上看起來相同的兩種顏色可能包含不同的波長組合;同樣,當在白光下觀看時,兩種染料可能看起來相同,但吸收不同波長的組合。當單獨使用時,這些染料可能看起來彼此相同,但是當與其他物質結合使用時可能產生非常不同的看似結果。

雖然染料有時可能會很棘手,但是塗料更糟糕。油漆包含反射顆粒,並且碰到油漆表面的一些光線將被它撞擊的第一顆粒反射回來。在這方面,他們混合像添加劑的顏色。例如,如果油漆含有20%的綠色顆粒,那麼無論其可能包含哪些其他顏色,都會反射出大量的綠色光。另一方面,撞擊塗漆表面的一些光線會反射並撞擊多個顆粒。如果這些粒子中的任何一個吸收了某種顏色的光子,則該光子不會被反射。在這方面,塗料表現得更像減色。在實踐中,塗料的表現有點像添加劑的顏色,有點像減色,有時像古怪和古怪,完全不同。

0

實際上似乎轉換RGB-> XYZ->實驗室是否exatly爲RGB-同樣的事情> LAB

相關問題