2008-11-26 82 views
1

我有一個NSColor,我真的很想要它表示的32位RGBA值。有沒有簡單的方法來獲得這個,除了提取浮點數組件,然後乘法和ORing,並通常做嚴重的,依賴endian的東西?從NSColor中提取32位RGBA值

編輯:感謝您的幫助。真的,我期望的是一個可可功能,已經做到了這一點,但我自己也很酷。

回答

5

另一個更蠻力的方法是創建一個臨時的CGBitmapContext並填充顏色。

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,每個分量顏色值沒有8位的端點問題。字節序只有16位或更多的整數。你可以以任何你想要的方式佈置內存,但是無論是大端還是小端機器,8位整數值都是相同的。 (ARGB是Core Graphics和Core Image I相信的默認8位格式)。

爲什麼不這樣?:

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; 

然後你確切地知道它是如何在內存佈局。

還是這個,如果更清楚你:

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; 
+1

「FWIW,有與每分量8位顏色值沒有尾數的問題。」是有,如果你處理的像素爲32位單元(具有諸如uint32_t的類型)。試一試:在一個系統上保存一個RGBA像素,然後將其加載到另一個具有不同字節順序的像素上。你會得到ABGR。 – 2008-11-26 23:22:12

1

將4個浮點數轉換爲它們的整數表示形式,但是要實現這一點,是唯一的方法。

3

並非所有的顏色都有的RGBA表示。它們可能在RGBA中有一個近似值,但這可能會也可能不準確。此外,Core Graphics將「顏色」繪製爲圖案(例如,某些Mac OS X版本的窗口背景顏色)。