2009-05-20 10 views
12

Sto cercando di estrarre i componenti rgb di un UIColor per creare manualmente i pixel in un CGBitmapContext. Il seguente codice di esempio funziona bene per la maggior parte delle costanti UIColor ma, in modo confuso, non tutte. Vale a dire:Risultati anomali che ottengono componenti di colore di alcuni 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); 

I risultati per [UIColor yellowColor] sopra sono
r = 1.000000 g = 1.000000 b = 0.000000 a = 1.000000, come previsto.

[UIColor redColor] dà r = 1.000000 g = 0.000000 b = 0.000000 a = 1.000000, nuovamente come previsto. Allo stesso modo per blueColor e greenColor.

Tuttavia, i risultati per [UIColor blackColor] e [UIColor whiteColor] sembrano completamente anomala, e non so cosa sto facendo male (se davvero io sono).

Vale a dire, [UIColor blackColor] dà r = 0.000000 g = 1.000000 b = 0.000000 a = 0.000000, che è un tranparent verde,

e [UIColor whiteColor] dà r = 1.000000 g = 1.000000 b = 0.000000 a = 0.000000 , che è un giallo trasparente.

sarei grato se qualcuno potrebbe o:

(1) spiegare che cosa sto facendo male
(2) replicare i miei risultati anomali e dimmi che non sono io, o
(3) colpiscimi sopra la testa con un grosso martello in modo che smetta di ferire così tanto.

Howard

risposta

11

Si presume che lo spazio colore sia sempre RGBA, il che non è il caso.

provare questo codice:

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

E il modello produrrà kCGColorSpaceModelMonochrome.

+0

Brillante! Grazie. Sono stato confuso prima dal riferimento frequente a 'CGColorGetNumberOfComponents (color)' prima di chiamare 'CGColorGetComponents (color)'. Ora capisco perché. A proposito, non c'è un modo per stampare il * nome * del modello qui sopra, e non solo il suo valore? – hkatz

+0

Il debugger ti mostrerà il nome, non sono sicuro che tu possa stamparlo, poiché è una definizione const di un numero. – pgb

2

Penso che la cosa che ti manca è che i colori possono essere definiti in diversi spazi di colore: si sta assumendo sono tutti RGBA.

Ad esempio, the docs stato che blackColor "Restituisce un oggetto colore il cui valore di scala di grigi è 0.0 e il cui valore alfa è 1.0". Quindi penso che solo due componenti siano validi per il nero, non quattro.

Problemi correlati