ページ

2010年5月14日金曜日

SimpleCap - ウィンドウキャプチャで下のウィンドウも対象にする(4) 複数CGImage の合成

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)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