Domanda

Ho un NSColor e voglio davvero il valore RGBA a 32 bit che rappresenta. Esiste un modo semplice per ottenere questo, oltre a estrarre i componenti float, quindi a moltiplicare e ORing e fare generalmente cose grossolane e dipendenti dall'endiano?

Modifica: grazie per l'aiuto. Davvero, quello che speravo fosse una funzione Cocoa che già lo faceva, ma sono bravo a farlo da solo.

È stato utile?

Soluzione

Un altro approccio più bruto sarebbe quello di creare un CGBitmapContext temporaneo e riempire con il colore.

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, non ci sono problemi di endian con un valore di colore di 8 bit per componente. L'endianness è solo con numeri interi a 16 bit o superiori. Puoi disporre la memoria come preferisci, ma i valori interi a 8 bit sono gli stessi sia per una macchina big endian che per una piccola endian. (Credo che l'ARGB sia il formato predefinito a 8 bit per Core Graphics e Core Image).

Perché non solo questo ?:

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;

Allora sai esattamente come è disposto in memoria.

O questo, se ti è più chiaro:

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;

Altri suggerimenti

Non tutti i colori hanno una rappresentazione RGBA. Possono avere un'approssimazione in RGBA, ma ciò può essere o non essere accurato. Inoltre, ci sono "colori". disegnati da Core Graphics come motivi (ad esempio, il colore di sfondo della finestra in alcune versioni di Mac OS X).

La conversione dei 4 float nella loro rappresentazione intera, comunque tu voglia farlo, è l'unico modo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top