Pergunta

Eu estou tentando extrair os componentes RGB de um UIColor, a fim de mão-build os pixels em uma CGBitmapContext. O código de exemplo a seguir fina funciona para a maioria das constantes UIColor mas, confusamente, não todos. A saber:

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);

Os resultados para [UIColor yellowColor] acima são
r = g = 1.000000 1.000000 0.000000 b = a = 1.000000, como esperado.

[UIColor redColor] dá r = g = 1.000000 0.000000 0.000000 b = a = 1.000000, novamente como esperado. Da mesma forma para blueColor e greenColor.

No entanto , os resultados para [UIColor blackColor] e [UIColor whiteColor] parecem completamente anômalo, e eu não sei o que estou fazendo de errado (se de fato eu sou).

A saber, [UIColor blackColor] dá r = g = 0.000000 1.000000 0.000000 b = a = 0.000000, que é um verde tranparent,

e [UIColor whiteColor] dá r = g = 1.000000 1.000000 0.000000 b = a = 0.000000, que é um transparente amarelo.

eu apreciaria se alguém poderia ou:

(1) explicar o que estou fazendo de errado
(2) replicar meus resultados anómalos e me diga que não sou eu, ou
(3) me bateu na cabeça com um martelo grande para que ele parar de doer tanto.

Howard

Foi útil?

Solução

Você está assumindo o espaço de cor é sempre RGBA, o que não é o caso.

Tente este código:

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

E modelo irá produzir kCGColorSpaceModelMonochrome.

Outras dicas

Eu acho que a coisa que está faltando é que as cores podem ser definidos em diferentes espaços de cores:. Você está assumindo que eles estão todos RGBA

Por exemplo, os docs estado que blackColor 'Retorna um objeto de cor cuja escala de cinza valor é 0,0 e cujo alfa valor é de 1,0'. Então eu acho que apenas dois componentes são válidos para preto, não quatro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top