Como converter cores de um espaço de cor para outro?

Existe uma maneira do Cocoa Touch para converter cores de um espaço de cor para outro?

No final deste código:

UIColor *grey = [UIColor colorWithWhite: 0.5 alpha: 1.0];
CGColorRef greyRef = [grey CGColor];
int x = CGColorGetNumberOfComponents(greyRef);

...x é 2.

A razão pela qual eu preciso disso é que eu estou tentando copiar cores para uma lista de componentes de cor paraCGGradientCreateWithColorComponents, que precisa de todas as cores em um único espaço de cores. O problema é que o cinza está no espaço de cores em tons de cinza, em vez do RGB. (O nome me escapa no momento, mas não é 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;
}

Eu sei que posso procurar cores no espaço de cores em escala de cinza e convertê-las. Mas isso só resolve um caso. De olharnesta pergunta, Acho que o HSB é tratado também. Mas eu gostaria de escrever algum código aqui e nunca mais pensar sobre isso, o que significa apoiar não apenas os espaços de cores que estão lá agora, mas qualquer coisa que a Apple poderia acrescentar no futuro. Estou sem sorte?

questionAnswers(4)

yourAnswerToTheQuestion