Pergunta

Eu tenho um NSColor, e eu realmente quero o valor RGBA de 32 bits que representa. Existe alguma maneira fácil de conseguir isso, além de extrair os componentes flutuador, em seguida, multiplicar e ORing e geralmente fazendo, coisas endian-dependentes brutas?

Edit: Obrigado pela ajuda. Realmente, o que eu estava esperando era uma função de cacau que já fez isso, mas eu estou bem com a fazê-lo eu mesmo.

Foi útil?

Solução

Outra abordagem força mais bruta seria a criação de um CGBitmapContext temporário e preencha com a cor.

NSColor *someColor = {whatever};
uint8_t data[4];

CGContextRef ctx = CGBitmapContextCreate((void*)data, 1, 1, 8, 4, colorSpace, kCGImageAlphaFirst | kCGBitmapByteOrder32Big);

CGContextSetRGBFillColor(ctx, [someColor redComponent], [someColor greenComponent], [someColor blueComponent], [someColor alphaComponent]);

CGContextFillRect(ctx, CGRectMake(0,0,1,1));

CGContextRelease(ctx);

FWIW, não há problemas endian com um 8 bits por valor de cor componente. Endianness é apenas com 16 bit inteiros ou mais. Você pode colocar para fora a memória da maneira que quiser, mas os 8 valores bit inteiros são os mesmos se um grande endian ou pequena máquina endian. (ARGB é o formato de bit padrão 8 para Core Graphics e Core Imagem eu acredito).

Por que não apenas isso:?

uint32_t r = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor redComponent])) * 255.0f);
uint32_t g = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor greenComponent])) * 255.0f);
uint32_t b = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor blueComponent])) * 255.0f);
uint32_t a = (uint32_t)(MIN(1.0f, MAX(0.0f, [someColor alphaComponent])) * 255.0f);
uint32_t value = (r << 24) | (g << 16) | (b << 8) | a;

Então você sabe exatamente como ele é colocado para fora na memória.

Ou isso, se o seu mais claro para você:

uint8_t r = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor redComponent])) * 255.0f);
uint8_t g = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor greenComponent])) * 255.0f);
uint8_t b = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor blueComponent])) * 255.0f);
uint8_t a = (uint8_t)(MIN(1.0f, MAX(0.0f, [someColor alphaComponent])) * 255.0f);

uint8_t data[4];
data[0] = r;
data[1] = g;
data[2] = b;
data[3] = a;

Outras dicas

Nem todas as cores Have uma representação RGBA. Eles podem ter uma aproximação em RGBA, mas que pode ou não ser precisos. Além disso, há "cores" que são desenhadas por Core Graphics como padrões (por exemplo, a cor de fundo da janela em algumas versões do Mac OS X).

A conversão dos 4 carros alegóricos para a sua representação inteiro, no entanto você quer conseguir isso, é o único caminho.

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