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);