ページ

2009年10月28日水曜日

Safari用独自プラグインを作る(11) - スクリーンショットを撮る

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

(前回)Cocoaの日々: Safari用独自プラグインを作る(10) - コンテキストメニューの調査

さていよいよ本題の(?)スクリーンショットを試す。コンテキストメニューへの独自メニュー追加はできているので、ここにスクリーンショットを撮る処理を追加する。

まずメニュー追加の箇所。

SXSafariContextMenuSwizzler.m

- (NSArray *)_sx_webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems {

NSArray* menu_items = [self _sx_webView:sender
contextMenuItemsForElement:element
  defaultMenuItems:defaultMenuItems];

NSMutableArray* new_menu_items = [NSMutableArray arrayWithArray:menu_items];

[new_menu_items addObject:[NSMenuItem separatorItem]];

NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:@"Take a screenshot"
            action:@selector(takeScreenshot:)
            keyEquivalent:@""] autorelease];

[item setRepresentedObject:sender];
[item setTarget:_shared_instance];
[new_menu_items addObject:item];

return new_menu_items;
}


NSMenuItem の representedObject に WebView インスタンスを渡してやる。


そしてスクリーンショットを撮る処理。

- (void)takeScreenshot:(id)sender
{
WebView* web_view = [sender representedObject];
NSView* doc_view = [[[web_view mainFrame] frameView] documentView];

NSBitmapImageRep* bitmap = [doc_view bitmapImageRepForCachingDisplayInRect:[doc_view bounds]];
[doc_view cacheDisplayInRect:[doc_view bounds] toBitmapImageRep:bitmap];

NSData* outdata = [bitmap representationUsingType:NSPNGFileType
                properties:[NSDictionary dictionary]];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString* path = [NSString stringWithFormat:@"%@/test.png", [paths objectAtIndex:0]];
[outdata writeToFile:path atomically:YES];

NSLog(@"took a screenshot");
}


これは以前検証した時のコードを参考にした

Cocoaの日々: WebKit検証(3) - ビューを画像に保存
Cocoaの日々: WebKit検証(4) - Webのキャプチャ


さて実行してみよう。

apple.com を撮影してみる。まずページを開く。



コンテキストメニューから "Take a screenshot" を選択する。



デスクトップに画像ファイルが作成された。



できた。



おお、いい感じだ。


ついでに Flash ページも見ておく。Flashが含まれるページを開く。




撮影すると。。

出た。



Flash でも問題ないな。
以前の検証ではこの方法を使った場合 Flashの色がおかしかったが今回は問題なかった。 Safariをバージョンアップしたせいかもしれない(以前の検証時は バージョン 3、現在はバージョン 4)。

(以前のFlash検証)Cocoaの日々: WebKit検証(11) - Flash