resultados anómalos recebendo componentes de cor de algumas UIColors
-
23-08-2019 - |
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
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.