Paparazzi! は古いバージョンだがソースコードが用意されている。ポイントだけ引用してみる。
PaparazziController.m
- (id)initWithWindow:(NSWindow *)window {
if (self = [super initWithWindow:window]) {
webWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(-16000.0, -16000.0, 100.0, 100.0) styleMask:NSBorderlessWindowMask backing:NSBackingStoreRetained defer:NO];
webView = [[WebView alloc] initWithFrame:NSMakeRect(-16000.0, -16000.0, 100.0, 100.0)];
:
なるほど。表示領域外にウィンドウと WebViewを作っている。
- (IBAction)fetch:(id)sender {
:
[webWindow setContentSize:newSize];
[webView setFrameSize:newSize];
[self validateInputSchemeForControl:urlField];
[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];
}
サイズを調整し URLを表示する。
- (void)takeScreenshot {
:
[webView lockFocus];
bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:cropBounds];
[webView unlockFocus];
:
NSBitmapImageRep#initWithFocusedViewRect: を使いキャプチャしている。このメソッドは #lockFocus 対象のビューが表示している内容をビットマップイメージに落とす。隠れている部分はイメージに落ちないので、Webページ全体をキャプチャする場合、あらかじめビューのサイズを大きくとっておく必要がある。んん。これはこれまで試していた方法に近い。
表示領域ではウィンドウのサイズに制約がかかっていたが、表示領域外であれば制約がかからないということだろうか。