Mentha Spicata

自分がやったお仕事原稿のフォローアップなどを掲載していきます。

効率的なスクリーンショット作りを試行錯誤する その1:Mac編

年末は12/31 24:50ごろまで原稿を泣きながら書いていた氷川です。あらためまして新年あけましておめでとうございます。

去年1年を振り返ってみるとよくもまあ…雑誌16冊、書籍3冊、ムック3冊。書籍は共著が多いので分量的にはとんでもなくはないのですが、本業ではない身としてはよく睡眠時間と休日を削ったな、と自分を褒めてあげたくもなります(苦笑)。

氷川は基本的にはコンピュータ系のライター、しかも書籍やムックは「使い方」系の本のお仕事が多いので、作成する原稿には手順を示すスクリーンショットが欠かせません(しかも1アクションごとに撮らなければいけないものが多いので、入稿時の総ファイル容量がGB単位、うちテキストは10MB以下なんてことがよくあります)。作業をきめ細かにスクリーンをキャプチャするのは集中力がいるため、なるべく人為的なミスが介入する部分は省きたいところです。

仕事柄複数のプラットフォームを行き来してスクリーンショットを撮りますが、それぞれクセが微妙に違うので、個々別々のノウハウが必要だったりします。まず今回は、Macに絞って考えてみたいと思います。

Macはシステム標準で足りる

氷川も以前はスクリーンショット作成にはSnapz Pro Xを使っていましたが、10.7以降の環境では「インタラクティブモード時にカーソルを残して撮影できる」という機能が失われてしまっているため、OSの標準機能と同じもの+隠し設定項目をGUIで選択ぐらいしか提供されなくなってしまいました(まあ、もともと標準の機能を引き出すツールではあるんでしょうけど)。いいソフトでしたし、呼び出した後に自由にモードを変えられるという点ではスクリーンショット職人初級の方には、引き続きおすすめのソフトだと思いますし、値段も以前の半分くらいになっていてお手頃です。

裏返せばOS Xのscreencaptureは非常に強力で、標準で十二分な機能を提供していますので細かく見てみましょう。撮影はキーボードショートカットで発動します。

⌘+Shift+3

これで画面全体を撮影します。

⌘+Shift+4

この場合はインタラクティブモードに切り替わり、ドラッグして矩形で囲った部分が切り取られて撮影されます。

⌘+Shift+4, [space]

のようにインタラクティブモード時にスペースキーをたたくと、カーソルがカメラアイコンに変わり、カーソルを重ねたウインドウのみがクリックされたタイミングで撮影されます。UIWindowをちゃんと見ているので、ウインドウが重なって非表示になってくれる部分もばっちり撮ってくれます。

この際にウインドウのドロップシャドウも撮られます。まあ、トリミングしてしまえばどうということもありませんが、シャドウなし図版を大量に必要とする場合には、Optionキーを押しながらクリックするとドロップシャドウがつかずに撮影されます。

また、OS Xには「シート」と呼ばれるダイアログの一種があるのですが、10.6まではウインドウ本体とシートとを別々に撮影できました。10.7以降、このシートが「Powerbox」という独立したフレームワークを使うようになり標準のままではシート+ウインドウという形で撮影されるようになりました。

f:id:risonah:20130316151902p:plain

これはこれで使い手があるのですが、このままトリミングするとシートは半透明なので裏写りが美しくありません。そこで⌘キーを押してみると…

f:id:risonah:20130316152219p:plain

ハラショー。とても素晴らしいですね。このように有料のアプリを使わないでも融通の利いたスクリーンショットは撮れるものです。また、インタラクティブモードの範囲選択はかなりマニアックな操作が可能になっており、全部解説すると大変な分量になるので、まとめて見たい方はこちらからビデオでどうぞ。

自分の都合に合わせてカスタマイズ

とても便利なscreencaptureですが、デフォルトのままだと困るときもあります。撮影された画像はファイル名が「スクリーンショット 日付 時刻」で命名され、逐次デスクトップにPNGファイルが生成されます。

まず、デスクトップ画面のキャプチャをしているときに作業効率が悪くなります。なるべくよけいなものは写らない、シンプルで美しいショットを心がけている氷川としては「イラッ☆」とせざるを得ないのが本音です。

最初に考えられるのがクリップボードへの保存です。Controlキーを押しながら撮影すればファイルはクリップボードへと保存されるため、プレビュー.appで「クリップボードから新規作成」を実行するという手が使えるようになります。が、これでは一連の動作をキャプチャする場合、都度都度手が止まってしまいますので、思い切ってdefaultsコマンドで保存先をこんな感じで変えてみましょう。

defaults write com.apple.screencapture location ~/Pictures/Screenshot
killall SystemUIServer

ここでは保存先をホームフォルダ内のピクチャ/Screenshotに変更してみました。com.apple.screnncaptureは、無くても作られるので大丈夫です。2行目にあるように、最後にSystemUIServerをkillallするか、再起動しないと設定ファイルが読み込まれないので「設定が反映されない?!」と慌てないようにしましょう。

次の問題はファイル形式です。PNG形式で基本は良いと思うのですが先方の都合で「PSD形式で納品お願いします」などと頼まれることもあるでしょう。そもそもスクリーンショットの標準形式もJPEG(10.2〜)、PDF(10.4〜)、PNG(10.6〜)と遷移しているわけですから、将来だって標準のフォーマットが変わるかも知れません。アップルがどう仕様変更しようと納品先に合わせなければ意味がありませんので、ここもさくっと変えてしまいましょう。

defaults write com.apple.screencapture type psd
killall SystemUIServer

これでお客さんも大喜びです。設定できる画像フォーマットはOSのバージョンに依存しますが、10.8では

  • png
  • gif
  • jpg
  • jp2
  • bmp
  • exr
  • pdf
  • psd
  • pct
  • sgi
  • tga
  • tif

このあたりが使えると思います。

コマンドラインから実行する

非常に便利なscreencaptureですが、実体は/usr/sbin/screencaptureでコマンドラインから実行することも出来ます。

$ which screencapture

/usr/sbin/screencapture

実際にどのくらいの機能があるのかman screencaptureを実行し、引数を紐解いてみましょう。これは10.8.2のものです。

SCREENCAPTURE(1)          BSD General Commands Manual         SCREENCAPTURE(1)



NAME

     screencapture -- capture images from the screen and save them to a file

     or the clipboard



SYNOPSIS

     screencapture [-SWCTMPcimswxto] file

まずSYNOPSISから見ると標準的な「コマンド 引数 保存先」であることがわかります。

DESCRIPTION

     The screencapture utility is not very well documented to date.  A list of

     options follows.

DESCRIPTIONの最初から「このドキュメントは非常によくない」と書いてあるのもいかがなものかと思いますが…。確かに説明が多いのと、使ってみないとわかりづらいコマンドなので、オプションをひとつずつ見て行きましょう。

     -c      Force screen capture to go to the clipboard.

小文字のcオプションを付けるとクリップボードに保存されます。これはControlキーを押したときと同じ動作です。

     -C      Capture the cursor as well as the screen.  Only allowed in non-

             interactive modes.

大文字のCオプションは撮影時にカーソルを含めます(逆にこの引数を含めない場合には必ずカーソルは含まれません)。またこのオプションはインタラクティブモードでは動作しません。

     -i      Capture screen interactively, by selection or window.  The con-

             trol key will cause the screen shot to go to the clipboard.  The

             space key will toggle between mouse selection and window selec-

             tion modes.  The escape key will cancel the interactive screen

             shot.

小文字のiオプションはインタラクティブモードに切り替わります。これは「⌘+Shift+4」のキーボードショートカットで起動したときと同じ動作になります(スペースキーを押しての状態遷移も受け付けます)。

     -m      Only capture the main monitor, undefined if -i is set.

小文字のmオプションはマルチモニタ用で、メインモニタ(メニューバーが表示されているモニタを指します)の画面キャプチャのみを行ないます。逆にこの引数が指定されていない場合の全画面撮影は、接続されているディスプレイの数だけファイルが生成されることになります。

     -M      Open the taken picture in a new Mail message.

大文字のMオプションを付けるとキャプチャされたファイルが新規メールメッセージに添付されます。

     -o      In window capture mode, do not capture the shadow of the window. 

小文字のoオプションを付けるとウインドウのドロップシャドウを撮影しません。これはOptionキーを押したときと同じ動作です。

     -P      Open the taken picture in a Preview window.

大文字のPオプションを付けるとキャプチャされたファイルがプレビュー.appで自動的に開かれます。

     -s      Only allow mouse selection mode. 

小文字のsオプションは「⌘+Shift+4」のキーボードショートカットで起動したときの領域選択と同じ動作をします。ただしiオプション異なりスペースキーを押してもウインドウ撮影モードには遷移しません。

     -S      In window capture mode, capture the screen instead of the window.

通常のウインドウ撮影モードは上に重なったウインドウは無視して撮影してくれますが、この大文字Sオプションを付けると、上に重なったウインドウは重なったまま撮影してくれます。単独では動作しないので、-iSとか-aiSみたいな感じで組み合わせて使うといい感じです。

     -t      <format> Image format to create, default is png (other options

             include pdf, jpg, tiff and other formats).

小文字のtオプションを使うと、ファイルフォーマットを指定してキャプチャできます。指定しない場合にはデフォルトのPNGが使用されますが、先ほどのリストの通り、指定してやれば異なるフォーマットで作成することもできます。plistを毎回書き換える運用と上手く組み合わせてあげるとベターです。

     -T      <seconds> Take the picture after a delay of <seconds>, default is

             5.

大文字のTオプションは「タイマー」モードです。-Cと併用することでドラッグ&ドロップ中のショットなどを撮ることができます(以前はSnapz Pro Xを使用することでインタラクティブモードでも強制的に撮ることができましたが…残念な結果に)。

     -w      Only allow window selection mode.

小文字のwオプションはインタラクティブモードで、かつウインドウ撮影モードに限定します(スペースキーを押しても切り替わりません)。

     -W      Start interaction in window selection mode. 

大文字のWオプションはインタラクティブモードをウインドウ撮影モードからスタートしてくれます(スペースキーで領域選択モードに切り替わります)。個人的にはウインドウ撮影モードが中心なので、こちらがデフォルトになってくれると嬉しいのですけど。

     -x      Do not play sounds. 

小文字のxオプションを付けると、撮影時のシャッター音がしなくなります。一見便利なのですが、screencaptureはときどき遅延が発生するので、個人的にはミュートは使わないようにしています。

     -a      Do not capture attached windows. 

小文字のaオプションを付けると、シートなどを独立してウインドウ選択できるようになります。これは⌘キーを押したときと同じ動作です。

     -r      Do not add screen dpi meta data to captured file. 

小文字のrオプションを付けて撮影した場合、ファイルにdpiのメタ情報が付与されずに保存されます。

     files   where to save the screen capture, 1 file per screen

SYNOPSISでも書かれていましたが、screencaputureコマンドはファイルの保存パスを必ず指定する必要があります。また、1コマンド実行で1回しか撮影は行われません(だったら「files」じゃないでしょう…とツッコミをいれたくなりますが)。

BUGS

     Better documentation is needed for this utility.



SECURITY CONSIDERATIONS

     To capture screen content while logged in via ssh, you must launch

     screencapture in the same mach bootstrap hierarchy as loginwindow:



     PID=pid of loginwindow

     sudo launchctl bsexec $PID screencapture [options]



HISTORY

     A screencapture utility first appeared in Mac OS X v10.2.



Mac OS                           June 16, 2004                          Mac OS

「このマニュアルにはよりよいドキュメントが必要だ」っていう自虐さはともかく、これ、コマンドラインで動作するのでリモートで撮影も可能なんですよね。sshでログインすれば、

$ screencapture remoteShot01.png | scp remoteShot01.png ladmin@10.0.0.1:tmp 

なんていう真似も可能に。実際に、リモートでMac Buddy(初回セットアップ時にやるアシスタント。「ようこそ」画面とか言われてます)のスクリーンショットを撮るという業務を見ているので、ニッチなニーズはあるんだと思います。

Automatorの「サービス」を使って応用する

このようにコマンドライン経由のほうがキーボードのみの操作よりも若干多機能になっています。せっかくですから欲しい機能はキーボードショートカットに組み込みましょう。 

氷川が個人的に欲しい機能は、まずタイマーです。オブジェクトをドラッグしているアニメーションなどをカーソル込みで欲しいので

screencapture -C -T 3 -t png ~/Desktop/`date +%s`.png

というコマンドを作ってみました。これをAutomator.appに組み込んでみましょう。アプリケーションを起動したら書類タイプを「サービス」として選択します。

f:id:risonah:20130317002514p:plain

ユーティリティのジャンルから「シェルスクリプトを実行」を選んでワークフローに入れたら、先ほどのコマンドを入れておきます。また、「"サービス"は、次の項目を受け取ります」のポップアップメニューは「入力なし」に、検索対象は「すべてのアプリケーション」にしておきましょう。

f:id:risonah:20130317002850p:plain

完了したら保存しましょう。ここでは「タイマー撮影」と名前をつけておきました。

f:id:risonah:20130317003351p:plain

最後の仕上げです。システム環境設定.appの「キーボード」ペインから「キーボードショートカット」タブを選択して、「サービス」グループから「一般」にある先ほど作成した「タイマー作成」を選択し、キーボードショートカットを割り当てます。

f:id:risonah:20130317003925p:plain

これで完成です。ここでは他のキーボードショートカットの例に倣って「⌘+Shift+5」を割り当ててみました。

f:id:risonah:20130317004246p:plain

作成したサービスを他の環境でも使いたい場合には「~/Library/Services」の中に実体のファイルが入っていますので、コピーして配ることも可能です(※10.8の環境に配布する際にはGatekeeperのセキュリティに引っかかります。ダブルクリックではなく「ファイル>開く」メニューから実行する必要がありますのでご注意を)。

余談。

実はシートを撮るコマンドには問題があって、シート内部にオプションがあるとこの部分だけ「別ウインドウ」として区別されます。

f:id:risonah:20130317000935p:plain

のっぺらぼうではちょっと困りますのでこれも工夫して

screencapture -aiS -t png ~/Desktop/`date +%s`.png

としてみました。これならば!

f:id:risonah:20130317001527p:plain

…と思いましたが、裏映りしてるし、ツールバーのシャドウまで重なるし、ドロップシャドウはないし。今のところは合成しないとダメですね。

 

参考資料

ワンライナーでそのまま使えるスクリーンショットが撮れる!
screencaptureコマンドのオプションの解説が大変詳しいエントリでした。…が、ここで扱ってるmanの内容がうちのと違うんですが、どのバージョンなんでしょう。

     -l      <windowid> capture this windowsid

     -R      <x,y,w,h> capture screen rect

 lオプションはちょっとマニアックかつ、手間がかかるので玄人向けなのですが実はかなり細かいパーツ単位で取れるので便利です。そしてRオプションは期待通りに動かないのでもう少し要研究です。

ライセンスの提示

クリエイティブ・コモンズ・ライセンス

本エントリーの図版で使用しているテキストの一部は、藤井太洋さんのGene Mapperをクリエイティブ・コモンズライセンスに基づいて使用させていただいています。