2012-04-13 2 views
6

Ich mache ein iOS-Spiel mit cocos2d-Bibliotheken.Hinzufügen von Farben (Farben) Zusammen wie Malen (Blau + Gelb = Grün, usw.)

Können sagen, Sie haben zwei Objekte, die zwei separate Farben haben - definiert in RGB als

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

I blau und gelb machen grün hinzufügen möchten.

Um Dinge zu komplizieren, sagen wir, dass das blaue Objekt größer als das gelbe Objekt ist (um das Argument zu sagen, dass das Verhältnis 2: 1 ist), addiere ich doppelt so viel Blau wie Gelb - wie Ich berechne diese neue (hellgrüne) Farbe richtig.

Ich verstehe LAB * Farbraum ist nützlich für diese Art von 'natürlicher Farbe' Art von Sache, aber ich bin mir nicht sicher, wie man es verwendet - vor allem im Zusammenhang mit einem cocos2d-Objekt, das (AFAIK) beschränkt ist RGB in seinen Farbschemata verwenden.

Ich würde wirklich praktische Hilfe schätzen, wie dies zu implementieren ist. Tausend Dank!

21/4 Update: Also in LAB * blau + gelb ≠ grün (was sinnvoll ist, wenn Sie they're at opposite ends of the same channel sehen). Es ist eigentlich ein ziemlich kniffliges Problem mit einer littlebit Diskussion über SO. Es scheint, dass die ultimative Antwort die Kubelka-Munk-Methode ist, die ein Stück Open-Source-Software namens Krita verwendet. Ich kann das nirgendwo finden (entweder die Formel oder den Code selbst).

This question hat a link, die HSL verwendet, um in einer ähnlichen Methode zu malen. Ich werde versuchen zu sehen, ob es funktioniert, und ich werde das Ergebnis hier wiedergeben.

In der Zwischenzeit if anyone knows how to implement Kubelka-Munk oder wo ich Code, dies zu tun finden können oder eine andere Lösung, würde ich sehr, sehr begeistert!

+1

'Blue + Yellow' ist nie' Green', wenn Sie erfahren, dass in der Vorschule. Worauf es sich tatsächlich bezieht, ist ein einfaches substraktives Farbmodell wie CMYK, wobei "1 - Cyan - Gelb ≈ Grün" (mit "Cyan ≈ Blau"). – leftaroundabout

Antwort

2

Überprüfen Sie die Formeln auf dieser Website: http://www.easyrgb.com/index.php?X=MATH Ich habe ähnliches getan, und es kann durch die Konvertierung RGB-> XYZ-> Lab erreicht werden. Allerdings ist die Berechnung ziemlich teuer (wenn Sie es für viele Pixel tun).

Und vergessen Sie RGB Mathe, wenn sie versuchen, Farben zu mischen, wenn Sie Ergebnisse ähnlich dem menschlichen Auge erhalten wollen

+0

Also ObjektA, ObjektB sind mit RGB gefärbt - konvertieren Sie die RGB zu XYZ dann zu LAB, fügen Sie die zwei Farben zusammen, dann konvertieren Sie sie wieder in XYZ und RGB wieder? – glenstorey

+0

Ja genau, wie ich geschrieben habe, erfordert es eine Menge Berechnung (Ich analysierte das gesamte Bild Pixel für Pixel) aber gibt anständige Ergebnisse –

+0

Wenn Sie die beiden Farben zusammen in den LAB-Raum hinzufügen. Wie wird das richtig gemacht? Nur L1 * 0,5 + L2 * 0,5, A1 * 0,5 + A2 * 0,5 und B1 * 0,5 + B2 * 0,5? – Christoffer

2

denke ich, es wert ist HSL-Farbraum zu versuchen. Wenn Farben hinzugefügt werden, interpolieren wir ihre Farbtonwerte (sogar die Berücksichtigung von Objektgewichten). Wenn die Farben zu 100% gesättigt sind, sind die Werte für Helligkeit und Sättigung gleich.

5

Es gibt kein Farbmodell, bei dem das Mischen von Blau und Gelb zu Grün führt. Probieren Sie es selbst mit Gouache, die einzige Art, wie es funktioniert, ist Cyan und Gelb. Deshalb sollten Sie versuchen, von RGB zu CMYK und zurück zu wechseln, wenn Sie benötigen. Hier ist, wie es

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); 
} 

Und dann in Ihrem Code fertig ist, mischen Sie das Cyan und Gelb

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]); 

den Code ausführen, wird Ausbeute: RGB mix = (0.000000, 255.000000, 0.000000)

+0

Vielen Dank für Ihre Antwort, vor allem für den Code. Ich denke, dass dies für Gelb plus Blau funktionieren wird - aber ich weiß nicht, ob es für andere Farbarithmetik funktioniert. Ich habe einige Nachforschungen darüber gemacht und Antworten wie diese: http://Stackoverflow.com/a/398268/459116 LAB ist der beste Weg zu gehen. – glenstorey

+0

Ich habe es mit gelben und blauen Modellfarben gemacht, wo das Blau ein tiefes Blau war, das nicht "grünlich" war - definitiv nicht "cyan", und das Ergebnis war definitiv grün. So etwas würde mit Druckfarben nicht passieren, kann aber leicht mit Farben passieren und kann manchmal auch mit Farbstoffen passieren. (Siehe meine Antwort für weitere Informationen) – supercat

1

Farbstoffe funktionieren nicht in der realen Welt ganz ähnlich wie subtraktive Farbmodelle vermuten lassen.Die für den CYMK-Druck verwendeten Farbstoffe liegen ziemlich nahe, da sie für diesen Zweck formuliert sind, aber viele Farbstoffe, die aus natürlich vorkommenden Substanzen hergestellt werden, können sich etwas merkwürdig verhalten. Die Schwierigkeit besteht darin, dass, während weißes Licht als eine Kombination von Rot, Grün und Blau wahrgenommen wird, es tatsächlich aus vielen verschiedenen Wellenlängen besteht - wörtlich "alle Farben des Regenbogens" - von denen jeder das Rot, Grün, und blaue Rezeptoren im Auge in unterschiedlichen Mengen. Es ist möglich, dass zwei Farben, die identisch erscheinen, tatsächlich unterschiedliche Kombinationen von Wellenlängen enthalten; Gleichermaßen können zwei Farbstoffe bei Betrachtung mit weißem Licht identisch erscheinen, absorbieren jedoch verschiedene Kombinationen von Wellenlängen. Solche Farbstoffe können identisch aussehen, wenn sie allein verwendet werden, können jedoch in Kombination mit etwas anderem zu sehr unterschiedlichen Ergebnissen führen.

Obwohl Farbstoffe manchmal schwierig sein können, sind Farben noch schlimmer. Farben enthalten reflektierende Partikel, und ein Teil des Lichts, das auf eine bemalte Oberfläche trifft, wird durch das erste Teilchen, auf das es trifft, von der Oberfläche reflektiert; in dieser Hinsicht mischen sie sich wie additive Farben. Wenn die Farbe beispielsweise 20% grüne Partikel enthält, wird eine erhebliche Menge an grünem Licht reflektiert, unabhängig davon, welche anderen Farben es enthält. Auf der anderen Seite springt ein Teil des Lichts, das auf eine lackierte Oberfläche trifft, um mehrere Teilchen herum und trifft sie. Wenn eines dieser Teilchen ein Photon einer bestimmten Farbe absorbiert, wird dieses Photon nicht reflektiert. In dieser Hinsicht verhalten sich Farben mehr wie subtraktive Farben. In der Praxis verhalten sich Farben etwas wie additive Farben, etwa wie subtraktive Farben, und manchmal wie etwas Seltsames und Verrücktes und völlig unähnlich.

0

Eigentlich scheint es, dass RGB- Umwandlung> XYZ- LAB> tut exatly das Gleiche wie RGB-> LAB