ページ

2008年3月4日火曜日

画面キャプチャその4 - キャプチャ画像の保存

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

さていよいよ選択したウィンドウを画像ファイルとして保存する。今回のサンプルを実行すると "sample_shot.png" というファイルが作成される。



実行すると画面全体が暗くなり、マウス下のウィンドウだけがハイライト表示になる。ウィンドウを選びクリックすると画像ファイルが作成される。



ソース:FullScreenSample-4.zip


保存処理は MacOSX10.5から導入された関数群を使うと簡単にできる。

CGImageRef cgimage = CGWindowListCreateImage(rect, kCGWindowListOptionIncludingWindow, _spot_window_id, kCGWindowImageDefault);
NSBitmapImageRep *bitmap_rep = [[[NSBitmapImageRep alloc] initWithCGImage:cgimage] autorelease];
NSData* data = [bitmap_rep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]];
[data writeToFile:filename atomically:YES];


CGWindowListCreateImage()を使うと目的のウィンドウのキャプチャ画像の CGImageRefが取得できる。CGWindowID が必要となるが、CGWindowListCopyWindowInfo() で取得した CFDirectoryRef から kCGWindowNumberをキーとして取得したものを使う。この処理をウィンドウ選択時のコードに加える。

CFArrayRef window_list =CGWindowListCopyWindowInfo((kCGWindowListOptionOnScreenOnly|kCGWindowListOptionOnScreenBelowWindow|kCGWindowListExcludeDesktopElements), window_id);
   :
for (i=0; i < CFArrayGetCount(window_list); i++) {
window = CFArrayGetValueAtIndex(window_list, i);
   :
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowNumber),
kCGWindowIDCFNumberType, &_spot_window_id);
   :



初めてのウィンドウキャプチャだったがあっけないほど簡単にできた。
以前はわからないが、MacOSX10.5になってからかなり便利になったようだ。