¿Hay una forma Cocoa Touch para convertir colores de un espacio de color a otro?¿Cómo convertir colores de un espacio de color a otro?
Al final de este código:
UIColor *grey = [UIColor colorWithWhite: 0.5 alpha: 1.0];
CGColorRef greyRef = [grey CGColor];
int x = CGColorGetNumberOfComponents(greyRef);
... x
es 2.
La razón que necesito esto es que estoy tratando de copiar los colores a una lista de componentes de color para CGGradientCreateWithColorComponents
, que necesita todos los colores en un solo espacio de color. El problema es que el gris está en el espacio de color de escala de grises, en lugar del RGB. (El nombre se me escapa por el momento, pero no es importante.)
CGGradientRef createGradient(NSInteger inCount, NSArray* inColors, CGFloat* inLocations) {
CGColorSpaceRef theColorspace = CGColorSpaceCreateDeviceRGB();
size_t numberOfComponents = 4;
NSInteger colorSize = numberOfComponents * sizeof(CGFloat);
CGFloat *theComponents = malloc(inCount * colorSize);
CGFloat *temp = theComponents;
for (NSInteger i = 0; i < inCount; i++) {
UIColor *theColor = [inColors objectAtIndex: i];
CGColorRef cgColor = [theColor CGColor];
const CGFloat *components = CGColorGetComponents(cgColor);
memmove(temp, components, colorSize);
temp += numberOfComponents;
}
CGGradientRef gradient = CGGradientCreateWithColorComponents(theColorspace,
theComponents, inLocations, inCount);
CGColorSpaceRelease(theColorspace);
free(theComponents);
return gradient;
}
Sé que puedo buscar colores en el espacio de color en escala de grises y convertirlos. Pero eso solo resuelve un caso. Desde mirar at this question, creo que HSB también se maneja. Pero me gustaría escribir algún código aquí y no volver a pensar en él, lo que significa soportar no solo los espacios de color que hay ahora sino todo lo que Apple podría agregar en el futuro. ¿No tengo suerte?
Esta es una muy buena respuesta, aunque es posible que desee mencionar que los colores HSB se colocan en el espacio de color RGB. Por lo tanto, es perfectamente válido llamar 'getRed: green: blue: alpha:' en ellos. –
Hmm, no parece haber un 'kCGColorSpaceModelHSB':/ – damian
No. Se asignan al espacio RGB; usa el método RGB para ellos. De los documentos para 'colorWithHue: saturación: brillo: alfa:' ** La información de color representada por el objeto [el devuelto] está en el espacio de color RGB del dispositivo. ** –