2009-04-27 12 views
7
CGFloat* colors = CGColorGetComponents(hsbaColor.CGColor); 

Questo restituisce un float o una matrice di galleggianti? Sembra che l'asterisco sia una scorciatoia per la creazione di un array. È corretto?Cosa restituisce CGColorGetComponents()?

Quando chiamo questa funzione sulla proprietà CGColor di un oggetto UIColor HSB, converte i valori in RGB?

risposta

4

Sì, restituisce un array di CGFloats. In particolare, restituisce "una matrice di valori di intensità per i componenti del colore (compreso l'alfa) associati al colore specificato."

Le componenti colore restituite dipendono dallo spazio colore utilizzato da CGColorRef.

Ulteriori informazioni sono disponibili nello CGColor documentation.

+0

@htw Grazie. Significa che è sempre RGBA? Non ho visto uno spazio colore HSBA in nessuna delle API. –

+0

Non sempre: è possibile che CGColor sia stato creato nello spazio colore CMYK o bianco, ad esempio. Tuttavia, secondo la documentazione sulla programmazione dei colori di Apple (http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/DrawColor/index.html), lo spazio colore HSBA è designato come spazio colore RGBA. Quindi, sì, in questo caso, restituirebbe i componenti RGBA, poiché il colore è stato creato con componenti HSBA. – hbw

+0

@htw Grazie! Ho esaminato i documenti. Questo è sicuramente quello che dovevo trovare. Molto utile! –

1

Da Apple:

restituisce i valori delle componenti di colore (compresi alfa) associati ad un colore quarzo. Una matrice di valori di intensità per i componenti del colore (compreso alpha) associati a il colore specificato. La dimensione dell'array è maggiore del numero di componenti dello spazio colore per il colore.

5
CGFloat* colors = CGColorGetComponents(hsbaColor.CGColor); 

fa questo ritorno un galleggiante, o un array di carri? Sembra che l'asterisco sia una scorciatoia per la creazione di un array. È corretto?

Sort of.

CGFloat *colors dichiara una variabile con un puntatore ad almeno un CGFloat. CGColorGetComponents restituisce un puntatore a diversi CGFloats, uno dopo l'altro, un array C. Prendi il puntatore e assegnalo a (posiziona il puntatore) nella variabile colors.

Dichiarare la variabile non creare la matrice. In effetti, nemmeno lo CGColorGetComponents. Qualunque cosa abbia creato l'oggetto CGColor ha creato la matrice e l'ha memorizzata all'interno dell'oggetto; CGColorGetComponents consente di avere il puntatore a quella memoria.

La dichiarazione della variabile CGFloat *colors crea solo un luogo, la variabile, per memorizzare un puntatore su uno o più CGFloats. La cosa nella variabile è il puntatore e la cosa in quel puntatore è l'array.

Se non è ancora chiaro, vedere Everything you need to know about pointers in C.

+0

Qual è la durata della memorizzazione (i quattro float in memoria)? Chi lo possiede? Quando viene recuperato? –

+1

@NicolasMiari: O l'oggetto colore possiede l'array stesso a cui sta esaminando, nel qual caso non durerà più di un oggetto colore, oppure l'oggetto colore crea e autorizza una copia di tale array, nel qual caso durano quanto il pool di autorelease corrente. –

0

Per ottenere componenti RGB io uso:

// Get UIColor's RGB normalized components (0..1) 
CGFloat red, green, blue, alpha; 
[color getRed:&red green:&green blue:&blue alpha:&alpha]; 

// Convert RGB components to 8-bit values (0..255) 
int r = (int)(red * 255.0); 
int g = (int)(green * 255.0); 
int b = (int)(blue * 255.0);
0

Ecco un esempio di come è possibile convertire correttamente un CGColorRef myColorRef a un NSColor myNSColor:

NSColorSpace *cp = [[NSColorSpace alloc] initWithCGColorSpace:CGColorGetColorSpace(myColorRef)]; 
const CGFloat *components = CGColorGetComponents(myColorRef); 
size_t componentCount = CGColorGetNumberOfComponents(myColorRef); 
NSColor* myNSColor = [NSColor colorWithColorSpace:cp components:components count:componentCount];