角丸+影+白枠のケースを例にして処理を追ってみる。
まずCGWindowListCreateImage( ) でキャプチャ画像を用意し、NSImageに変換しておく。
次に最終画像を書き込む NSImage *output_imageを用意する。大きさは、影と白枠が付くので元画像よりも大きくなる。※説明しやすいように黄色で表現してある。
白枠用のパス NSBezierPath* frame_path を用意する。白枠が付かない場合も画像と同じ大きさで作っておく。影を描く時にこれを使う。なお今回は角が丸いので #bezierPathWithRoundedRect:xRadius:yRadius: を使う(角が丸くない場合は #bezierPathWithRect: を使う)。
output_imageのフォーカスをロックした上で、frame_pathを使って白く塗りつぶす。
[output_image lockFocus];
[[NSColor whiteColor] set];
[frame_path fill];
塗りつぶす前に NSShadow*shadow を作り #set しておく。そうすると上記の様に塗りつぶした領域の下に影が付く。
最後に src_image を上に描く。
画像の角を丸く切り抜くには、角丸のパスを作り、これを使って描画時にクリッピングする。こんな感じ。
できあがり。
角丸、影、白枠の有無によって上記の大きさや、処理の有無を調整すればいろいろな組み合わせで加工できる。
ソースコードは SimpleCap の一部として後日公開予定。