(前回)Cocoaの日々: SimpleCap - ウィンドウキャプチャで下のウィンドウも対象にする(3)
2つの CGImage を合成するには CGBitmapContext を使う。処理の流れは次の通り。
1. CGBimapContext を作成する - CGBitmapContextCreate
2. 最初の CGImage を作成した CGBitmapContext へ描く - CGContextDrawImage
3. 同様にして 次の CGImage を CGBitmapContext へ描く - CGContextDrawImage
4. CGBitmapContext から CGImage を取得する - CGBitmapContextCreateImage
CGBitmapContext の作り方は ADCにサンプルがある。
Quartz 2D Programming Guide: Graphics Contexts
- Creating a Bitmap Graphics Contex
まず、ここのコードを参考に(コピー)してメソッドを用意する。
-(CGContextRef)createBitmapContextWithCGSize:(CGSize)size
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
bitmapBytesPerRow = (size.width * 4);// 1
bitmapByteCount = (bitmapBytesPerRow * size.height);
colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);// 2
bitmapData = malloc( bitmapByteCount );// 3
if (bitmapData == NULL)
{
NSLog(@"Memory not allocated!");
return NULL;
}
context = CGBitmapContextCreate (bitmapData,// 4
size.width,
size.height,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
if (context== NULL)
{
free (bitmapData);// 5
NSLog(@"Context not created!");
return NULL;
}
CGColorSpaceRelease( colorSpace );// 6
return context;// 7
}
これを使って画像を合成する。こんな感じ。
CGImageRef cgimage1 = ...;
CGImageRef cgimage2 = ...;
CGRect context_rect = ...;
CGContextRef context = [self createBitmapContextWithCGSize:cgrect.size];
CGContextDrawImage(context, context_rect, cgimage2);
CGContextDrawImage(context, context_rect , cgimage1);
CGImageRef cgimage = CGBitmapContextCreateImage(context);
CGImageRelease(cgimage1);
CGImageRelease(cgimage2);
CGContextRelease(context);
(例)cgimage1
(例)cgimage2
(例)cgimage(合成後)
なお画像描画には Blend Modes が用意されていて、合成方式(明るくしたり、暗くするなど)を設定することができる。
Quartz 2D Programming Guide: Bitmap Images and Image Masks
Using Blend Modes With Images