2014-04-02 62 views
0

我創建使用ARGB和kCGImageAlphaPremultipliedFirst格式。爲什麼像素顏色存儲爲(255數據)?

UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); 
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; 
// more code - not relevant - removed for debugging 
image = UIGraphicsGetImageFromCurrentImageContext(); // the image is now ARGB 
UIGraphicsEndImageContext(); 

然後我嘗試(從這裏米納斯Petterson的使用代碼:Get Pixel color of UIImage)找到一個像素的顏色的圖像。 但因爲圖像是現在ARGB格式,我不得不修改了代碼與此:

alpha = data[pixelInfo]; 
    red = data[(pixelInfo + 1)]; 
    green = data[pixelInfo + 2]; 
    blue = data[pixelInfo + 3]; 

然而,這沒有奏效。

的問題是,(例如)紅色像素,在RGBA將表示爲(實際上255 0 0 255,但爲了簡單起見我用0至1的值),在圖像是表示爲和不(如我想) 。 任何想法爲什麼?難道我做錯了什麼?

PS。我必須使用的代碼看起來像它必須是這樣的:

alpha = 255-data[pixelInfo]; 
red = 255-data[(pixelInfo + 1)]; 
green = 255-data[pixelInfo + 2]; 
blue = 255-data[pixelInfo + 3]; 
+0

A(笨)的解決方案是隱蔽的使用該命令圖像RGBA:圖像= [UIImage的imageWithData:UIImagePNGRepresentation(圖像)];但我想至少有10個更好的方法來解決我的問題! – Gik

回答

1

有跡象表明,出現有一些問題:

「在某些情況下,主要是OpenGL的,術語‘RGBA’,其實就是顏色存儲在存儲器中,使得R是在最低地址,之後它G,之後B,和A最後。OpenGL的描述了上面的格式爲「BGRA」小端機器和「ARGB」上大端機上「。 (維基)

圖形硬件由OpenGL的支持上的OS X/iOS的,所以我認爲我們處理小端數據(英特爾/ ARM處理器)。所以,當格式爲kCGImageAlphaPremultipliedFirst(ARGB)little-endian的機器上是BGRA。但別擔心,有一個簡單的方法可以解決這個問題。

假設它的ARGB,kCGImageAlphaPremultipliedFirst,每個組件8位,每像素4個分量(這是UIGraphicsGetImageFromCurrentImageContext()返回什麼),don't_care-字節序:

- (void)parsePixelValuesFromPixel:(const uint8_t *)pixel 
         intoBuffer:(out uint8_t[4])buffer { 
    static NSInteger const kRedIndex = 0; 
    static NSInteger const kGreenIndex = 1; 
    static NSInteger const kBlueIndex = 2; 
    static NSInteger const kAlphaIndex = 3; 

    int32_t *wholePixel = (int32_t *)pixel; 
    int32_t value = OSSwapHostToBigConstInt32(*wholePixel); 
    // Now we have value in big-endian format, regardless of our machine endiannes (ARGB now). 

    buffer[kAlphaIndex] = value & 0xFF; 
    buffer[kRedIndex] = (value >> 8) & 0xFF; 
    buffer[kGreenIndex] = (value >> 16) & 0xFF; 
    buffer[kBlueIndex] = (value >> 24) & 0xFF; 
} 
相關問題