2014-04-02 5 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(); 

가 그럼 난 (: Get Pixel color of UIImage를 여기에서 미나스 Petterson로 코드를 사용하여) 픽셀의 색상을 찾으려고 사용하여 이미지를 만들 수 있습니다. 이미지가 나는이와 수정 된 코드를했다 ARGB 형식으로 지금부터 그러나 :

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

그러나이 작동하지 않았다.

문제는 이미지가에서는 (예를 들어) RGBA에 적색 화소, 즉이 1,001로 표현된다 (실제로는 255 0 0 255하지만, 간략화를 위해 I는 0 ~ 1의 값을 사용한다)이다 으로 나타내지 만 이 아님 (내가 생각한대로) . 이유가 무엇입니까? 내가 뭔가 잘못하고 있는거야?

추신.

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

A (바보) 용액 은밀한하는 것이다

가 ARGB, kCGImageAlphaPremultipliedFirst, 성분마다 8 비트 픽셀 당 4 개 개의 요소가 don't_care - 엔디 언 (즉 UIGraphicsGetImageFromCurrentImageContext()가 복귀 기능)하다고 가정 이 명령을 사용하여 이미지를 RGBA로 변환합니다. image = [UIImage imageWithData : UIImagePNGRepresentation (image)]; 하지만 내 문제를 해결할 수있는 더 나은 방법이 적어도 10 가지는 것 같습니다. – Gik

답변

1

가 발생하는 몇 가지 문제가 있습니다 :

"어떤 상황, 주로는 OpenGL에서, 용어"RGBA는 "실제로 색상을 의미한다 그것은이 있어야한다처럼 사용해야하는 코드가 보인다 R은 가장 낮은 주소에, G는 그 다음에, B는 그 다음에, 그리고 A는 마지막에 위치하도록 메모리에 저장됩니다. OpenGL은 위의 형식을 리틀 엔디안 컴퓨터에서 "BGRA"로, 빅 엔디안 컴퓨터에서 "ARGB" . " (위키)

그래픽 하드웨어는 OS X/iOS에서 OpenGL을 지원하므로 리틀 엔디안 데이터 (인텔/암 프로세서)를 처리한다고 가정합니다. 그래서 포맷이 리틀 엔디안 머신의 kCGImageAlphaPremultipliedFirst (ARGB) 일 때 그것은 BGRA입니다. 그러나 걱정하지 마십시오. 쉽게 해결할 수 있습니다.

- (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; 
}