RubyからMac OS Xのスクリーンショットを撮る

RubyからCocoaを叩いてMac OS Xスクリーンショットを撮るサンプル。

osx/cocoaがなければ、

$ sudo port install rb-cocoa

を実行すること。

なぜか「全体のスクリーンのRect」を意味するOSX::CGRectInfinite定数が見つからなかったので、 OSX::NSScreen.screensで、スクリーンリストを取得、その0番目が全体スクリーンなので、そのframeを手に入れ、 そのwidthとheightからOSX::CGRectを作成、そいつをCGWindowListCreateImageの引数に入れて呼んでいる。

require 'osx/cocoa'

f = OSX::NSScreen.screens[0].frame
cr = OSX::CGRectMake(0,0,f.width,f.height)
screenshot = OSX::CGWindowListCreateImage(cr, OSX::KCGWindowListOptionOnScreenOnly, OSX::KCGNullWindowID, OSX::KCGWindowImageDefault)

c = OSX::CIImage.imageWithCGImage(screenshot)
bitmaprep = OSX::NSBitmapImageRep.alloc.initWithCIImage(c)
blob = bitmaprep.representationUsingType_properties(OSX::NSJPEGFileType,nil)
blob.writeToFile_atomically("test.jpg",false)

スクリーンショットはNSObject。これをCIImageを経由してNSBitmapImageRepにして、ファイルタイプにJPGを指定してからファイル名を指定して保存する。