2009-05-20 9 views
12

Ich versuche, die RGB-Komponenten von UIColor zu extrahieren, um die Pixel in einem CGBitmapContext Hand-Build. Der folgende Beispielcode funktioniert für die meisten der Konstanten UIColor, aber zum Verwechseln nicht alle. Nämlich:Anomale Ergebnisse bekommen Farbkomponenten von einigen UIColors

CGColorRef color = [[UIColor yellowColor] CGColor]; 
const float* rgba = CGColorGetComponents(color); 

float r = rgba[0]; 
float g = rgba[1]; 
float b = rgba[2]; 
float a = rgba[3]; 

NSLog(@"r=%f g=%f b=%f a=%f", r, g, b, a); 

Die Ergebnisse für [UIColor yellowColor] oben sind
r = 1,000000 1,000000 g = b = 0,000000 a = 1,000000, wie erwartet.

[UIColor redColor] gibt r = 1,000000 0,000000 g = b = 0,000000 a = 1,000000, wieder, wie erwartet. Ähnlich für blueColor und greenColor.

jedoch, die Ergebnisse für [UIColor blackColor] und [UIColor whiteColor] scheinen völlig unregelmäßig, und ich weiß nicht, was ich falsch mache (wenn ja ich bin).

Nämlich gibt [UIColor blackColor] r = 0,000000 g = 1,000000 b = 0,000000 a = 0,000000, der ein tranparent grün ist,

und [UIColor whiteColor] geben r = 1,000000 g = 1,000000 b = 0,000000 a = 0,000000 , was ein transparentes Gelb ist.

Ich würde es begrüßen, wenn jemand könnte entweder:

(1) erklären, was ich falsch mache
(2) meine anomale Ergebnisse replizieren und sagen Sie mir, ich bin es nicht, oder
(3) Schlag mir mit einem großen Hammer über den Kopf, so dass es nicht mehr so ​​weh tut.

Howard

Antwort

11

Sie gehen davon aus, dass der Farbraum immer RGBA ist, was nicht der Fall ist.

Versuchen Sie diesen Code:

CGColorRef color = [[UIColor blackColor] CGColor]; 
const CGFloat* rgba = CGColorGetComponents(color); 
CGColorSpaceRef space = CGColorGetColorSpace(color); 
CGColorSpaceModel model = CGColorSpaceGetModel(space); 
NSLog(@"%d", model); 

Und Modell kCGColorSpaceModelMonochrome ergibt.

+0

Brilliant! Vielen Dank. Ich war vorher verwirrt durch den häufigen Verweis auf 'CGColorGetNumberOfComponents (color)' vor dem Aufruf von 'CGColorGetComponents (color)'. Jetzt verstehe ich warum. Übrigens, gibt es keine Möglichkeit, den * Namen * des obigen Modells auszudrucken, und nicht nur seinen Wert? – hkatz

+0

Der Debugger wird Ihnen den Namen anzeigen, ich bin mir nicht sicher, ob Sie ihn ausdrucken können, da es sich um eine const Definition einer Zahl handelt. – pgb

2

Ich glaube, das, was Sie fehlt sind, ist, dass Farben in verschiedenen Farbräumen definiert werden: Sie vorausgesetzt, sie alle RGBA sind.

Zum Beispiel, the docs Zustand, dass blackColor "Gibt ein Farbobjekt, dessen Graustufenwert 0,0 ist und dessen Alpha-Wert 1,0 ist." Also ich denke nur zwei Komponenten sind gültig für Schwarz, nicht für vier.