2014-04-02 136 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; 
} 
相关问题