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

¿Este devuelven un flotador, o una serie de flotadores? Parece que el asterisco es una abreviatura para crear una matriz. ¿Es eso correcto?¿Qué devuelve CGColorGetComponents()?

Cuando llamo a esta función en la propiedad de un objeto CGColor HSB UIColor qué convertir los valores de RGB?

Respuesta

4

Sí, devuelve una matriz de CGFloats. Específicamente, devuelve "una matriz de valores de intensidad para los componentes de color (incluido alfa) asociados con el color especificado".

Los componentes de color devueltos dependen de qué espacio de color CGColorRef los usos pasados.

Más información se puede encontrar en el CGColor documentation.

+0

@htw Gracias. ¿Esto significa que siempre es RGBA? No he visto un espacio de color de HSBA en ninguna parte de la API. –

+0

No siempre, el CGColor podría haberse creado en el espacio de color CMYK o blanco, por ejemplo. Sin embargo, de acuerdo con la documentación de programación de color de Apple (http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/DrawColor/index.html), el espacio de color HSBA se designa como el espacio de color RGBA. Entonces, sí, en este caso, devolvería componentes RGBA, ya que el color se creó con componentes HSBA. – hbw

+0

@htw ¡Gracias! He estado revisando los documentos. Esto es definitivamente lo que necesitaba encontrar. ¡Muy útil! –

1

De Apple:

devuelve los valores de las componentes de color (incluyendo alfa) asociados con un color de cuarzo. Una matriz de valores de intensidad para los componentes de color (incluido alfa) asociado con del color especificado. El tamaño de la matriz es uno más que el número de componentes del espacio de color para el color.

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

¿Este devuelven un flotador, o una serie de flotadores? Parece que el asterisco es una abreviatura para crear una matriz. ¿Es eso correcto?

Tipo de.

CGFloat *colors declara una variable que contiene un puntero al menos una CGFloat. CGColorGetComponents devuelve un puntero a varios CGFloats, uno después del otro: una matriz C. Tome ese puntero y asígnelo (ponga el puntero) a la variable colors.

Declarar la variable no crear la matriz. De hecho, tampoco lo hace CGColorGetComponents. Lo que sea que haya creado el objeto CGColor creó la matriz y la almacenó dentro del objeto; CGColorGetComponents le permite tener el puntero a ese almacenamiento.

Al declarar la variable CGFloat *colors, se crea solo un lugar, la variable, para almacenar un puntero a uno o más objetos CGFloats. La cosa en la variable es el puntero, y la cosa en ese puntero es la matriz.

Si esto todavía no está claro, ver Everything you need to know about pointers in C.

+0

¿Cuál es la vida útil del almacenamiento (los cuatro flotadores en la memoria)? ¿A quién pertenece? ¿Cuándo se recupera? –

+1

@NicolasMiari: O bien el objeto de color posee la misma matriz que le permite ver, en cuyo caso no durará más que el objeto de color, o el objeto de color crea y libera automáticamente una copia de esa matriz, en cuyo caso lo hará dura tanto como el grupo de autorrelease actual. –

0

Para obtener componentes RGB que utilizan:

// 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

Aquí hay un ejemplo de cómo se puede convertir correctamente 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];