[CoreGraphics] CGBitmapContextCreate의 CGBitmapInfo 값

CGBitmapContextCreate함수를 사용하여 그래픽 컨텍스트 객체를 만들 때, 사용하는 마지막 파라미터에 대한 의문

함수 원형은 일단 다음과 같다.

CGContextRef CGBitmapContextCreate (
    void *data,     // 통상 NULL을 쓴다.
    size_t width,       // 이미지의 가로 크기
    size_t height,      // 이미지의 세로 크기
    size_t bitsPerComponent,    // 컴포넌트(채널)별 비트 수, 통상 8을 쓴다. (RGBA로 32비트 색상을 쓰니까)
    size_t bytesPerRow, // 한줄에 들어가는 바이트 수. 이는 width * 4가 된다. (32비트가 4바이트니까)
    CGColorSpaceRef colorspace, // 컬러스페이스 객체
    CGBitmapInfo bitmapInfo // 문제의 마지막 파라미터
);

이와 같이 정의되어 있는데, 실제 예제들을 보면 (애플 개발자 문서에서도!) kCGImageAlphaPremultipliedLast 와 같은 값을 넘기는데, 이는 CGBitmapInfo가 아니라 CGImageAlphaInfo에 정의된 상수값이다!!

마지막 파라미터는 CGBitmapInfo라고 정의되어 있는데, 이 정보는 픽셀이 알파 채널을 포함하는지, 포함한다면 알파채널의 위치는 어디인지, 픽셀의 각 채널 값에 부동소수점 값을 허용할 것인지 등을 결정하는 정보로, 상수로 정의되어 있다. 파라미터의 타입은 CGBitmapInfo인데, CGImageAlphaInfo 값을 넘겨주어도 안전하게 동작한다.

CGBitmapInfo 는 다음과 같이 정의되어 있다. (CGImage.h)

enum {
    kCGBitmapAlphaInfoMask = 0x1F,
    kCGBitmapFloatComponents = (1 << 8),

    kCGBitmapByteOrderMask = 0x7000,
    kCGBitmapByteOrderDefault = (0 << 12),
    kCGBitmapByteOrder16Little = (1 << 12),
    kCGBitmapByteOrder32Little = (2 << 12),
    kCGBitmapByteOrder16Big = (3 << 12),
    kCGBitmapByteOrder32Big = (4 << 12)
};
typedef uint32_t CGBitmapInfo;

그리고 CGImageAlphaInfo는 다음과 같이 정의된다. (CGimage.h)

enum CGImageAlphaInfo {
    kCGImageAlphaNone,
    kCGImageAlphaPremultipliedLast,
    kCGImageAlphaPremultipliedFirst,
    kCGImageAlphaLast,
    kCGImageAlphaFirst,
    kCGImageAlphaNoneSkipLast,
    kCGImageAlphaNoneSkipFirst
};
typedef enum CGImageAlphaInfo CGImageAlphaInfo;

인터넷에서 눈에 띄는 예제들은 주로 kCGImageAlphaPremultipliedLast를 많이 쓰는 듯. 뷰에서 비트맵 기반 그래픽 컨텍스트를 생성하는 코드는 아래와 같다.

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate (
    NULL,
    self.bounds.size.width,
    self.bounds.size.height,
    8,
    self.bounds.size.width * 4,
    colorspace,
    kCGImageAlphaPremultipliedLast
);
CGColorSpaceRelease(colorspace);

참고 : https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGBitmapContext/Reference/reference.html