先日の SnapWeb に刺激され(?)ウィンドウキャプチャ方式のアプローチを試してみる (*)。
(*) 実際に SnapWebがこの方法をとっているかは不明
サンプルに「Capture」ボタンをつけて、AppController#capture: へ接続する。実装はこんな感じ。
{
// (1) setup filename
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDesktopDirectory, NSUserDomainMask, YES);
NSString* path = [NSString stringWithFormat:@"%@/test.png",
[paths objectAtIndex:0], nil];
// (2) capture
CGWindowID *windowIDs = calloc(1, sizeof(CGWindowID));
windowIDs[0] = [_window windowNumber];
CFArrayRef windowIDsArray =
CFArrayCreate(kCFAllocatorDefault, (const void**)windowIDs, 1, NULL);
CGImageRef cgimage =
CGWindowListCreateImageFromArray(
CGRectNull, windowIDsArray, kCGWindowImageBoundsIgnoreFraming);
NSBitmapImageRep *bitmap_rep =
[[[NSBitmapImageRep alloc] initWithCGImage:cgimage] autorelease];
NSData* data = [bitmap_rep representationUsingType:NSPNGFileType
properties:[NSDictionary dictionary]];
[data writeToFile:path atomically:YES];
CGImageRelease(cgimage);
free(windowIDs);
CFRelease(windowIDsArray);
}
キャプチャの方法は昨年来紹介しているので必要なら過去のブログを参照してみて欲しい。私の場合、SimpleCapのコードからコピー&ペーストで5分ぐらいでできた(手抜き)。
さあ実行してみよう。Flashを含むページを開き「Capture」ボタンを押す。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyMpWk8AcwM0dqmNmwr7ts_iyyQEGro9xuLr-SnEfcxCClsoAdhdtl5wf5h5UVm6HyExZraBC0kUAKj1uZf5jVsicxtjdjNkyGg5Jq2NQyVkxsqKXRQJpyeQQtdg6UzEvyvoH8AnPhLeqg/s400/090428-0001.png)
出た。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_ex3955FAbBVKKa30OJg3F6FdT34I3CBKZHcB_p2f6xRzfi_5IHtpg_ANiU2CsD3viSmv_y3-Q_zmmH0xnE0gvENuYmjU0M_3hk_m3ZfJeSFVxBrYOYta8ri5ToVPX-BYaqw19MQUZesR/s400/090428-0002.png)
ウィンドウを大きくすれば(当たり前だが)より大きな範囲をキャプチャできる。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7ZVBroDP4gr9MIwivordmiXyMDE7-wpsjU4znL9e8L68E85OEKSxJYx7KUlj1BDUGqhCBO9DoBpwNd5YZbR2R2werkuG76JU7vY-Wkl6WSNFi7usjra6eKVifqOcv-cGy3GM5hTCqBG9m/s400/090428-0003.png)
理論上は、ウィンドウを Webサイトが表示できる十分な大きさまで広げてキャプチャすれば、Webサイト表示全体の画像が作れるわけだ。
サンプル:
WebKitSample-2.zipお膳立てはできた。
(続く)