MacでScreenshotを自分好みにカスタマイズ

blogの記事を書いたりする際に画面のスクリーンショットをよく撮ります。Macだと「Cmd + Shift + 3」などのデフォルトのショートカットキーを使ってスクリーンショットを撮ることができます(詳細はAppleのサポートページで)。

ただ、デフォルトのままだとデスクトップに保存され、さらに名前も「スクリーンショット 2018-09-12 12.28.39.png」のように長ったらしくなってしまいます。

もちろん、

> defaults write com.apple.screencapture name "(変更したい名前)"
> killall SystemUIServer

で、”スクリーンショット”の部分を変更できますし、

> defaults write com.apple.screencapture location "(保存したい場所)"
> killall SystemUIServer

で、保存場所を変えることもできます。

でも、個人的には、デスクトップ以外の特定のディレクトリに「20180912013941.png」とスッキリした名前で一発保存したいわけです(日時の間のハイフン、スペース、ドットを削除したい)。

screencaptureコマンドとAutomatorで実現したのでその時のメモです。

screencaptureコマンド

Macにはターミナルから、”screencapture”コマンドを実行してスクリーンショットを撮ることができます。下記コマンドでヘルプが見れます。

$ screencapture -h

“screencapture -オプション 保存ファイル名”で実行できます。

私が必要なオプションは、

  • i : インタラクティブモード(Cmd + Ctrl + 4と同じ)
  • o : 影をつけない

です。保存ファイル名は”/path-to-dir/$(date +%Y%m%d%H%M%S)”で実現できます。DropboxのScreenshotsディレクトリに保存したいので、”/Users/ky/Dropbox/Screenshots/$(date +%Y%m%d%H%M%S)”とします。ちなみに、Dropboxの”スクリーンショットの共有”をOFFにしておく必要があります。ファイル名が変更されなかったりと悪さをします(ハマりポイント)。

Retina対策 – 画像を半分のサイズにする (sips)

MacBook ProのディスプレイはRetinaで、解像度はデフォルトで使用しているので、screencaptureでキャプチャした画像は2倍の解像度を持ちます。blogにアップするとめっちゃでかい(汗)。なので、画像のサイズを半分にするのがちょうどいいのです。画像の編集をするコマンド”sips”を使います。

キャプチャした画像のサイズを取得

> sips -g pixelWidth (filname)

で画像の横幅(px)を取得できます。

画像を縮小

> sips --resampleWidth (width[px]) (ファイル名)

上記を組み合わせて画像を1/2に縮小

fname="/Users/ky/Dropbox/Screenshots/"$(date +%Y%m%d%H%M%S)".png"
screencapture -io $fname
sips --resampleWidth $(sips -g pixelWidth $fname | sed 1d | awk '{x=$2;x=x/2;print x}') $fname

とすれば、1/2にリサイズされた画像を取得できます。

3行目を詳しく説明すると、”sips -g pixcelWidth $fname”を実行すると、出力が下記のようになります。

> sips -g pixelWidth 20180912145326.png
/Users/ky/Dropbox/Screenshots/20180912145326.png
  pixelWidth: 530

出力の一行目は不要なので”sed 1d”で一行目を削除、2行目の横幅”530″という値を”awk ‘{x=$2;x=x/2;print x}’”で取得した後、2で割って出力しています。この値を”sips –resampleWidth”の引数として与えてあげることで半分のサイズに縮小しています。(もっといい方法あったら教えてください。)

Automatorでサービス化

Automatorをつかって上記のコマンドをサービス化し、ショートカットキーで実行できるようにします。

Automatorを起動して”サービス”を選択します。

  1. “ユーティリティ”→”シェルスクリプトを実行”を右側にドラッグします。
  2. 上の”サービスは次の項目を受け取ります”を”入力なし”に
  3. その下側、シェルスクリプトを実行の部分に、上記のスクリプトを記載します。
  4. 右上の実行ボタンでうまく動くか確認して、問題なければ適当な名前をつけて保存します。私は”MyScreenshotForRetina”としました。

ショートカットキーに登録

“システム環境設定 → キーボード → ショートカット → サービス”とたどっていくと、一番下の方に”一般”という項目があって、上で保存したサービスがあります。

ショートカットキーを追加を選んで、好きなショートカットキーを登録します。他のショートカットキーに習って「Cmd + Shift + 7」としました。

(「Cmd + Shift + 5」はSkitchに取られているし、「Cmd + Shift + 6」はTouch barのスクリーンショットに取られています。)

まとめ

以上、Screenshotを自分好みにカスタマイズする方法をまとめました。Skitchだとウィンドウのスクリーンショット(「Cmd + Shift + 4 (+ Space)」に相当するもの)がありませんし、ファイル名も都度自分でつけないといけません。Skitchで編集するまでもないことも多いので、やっぱりデフォルトのScreenshotをカスタマイズするのが便利という結論にいたりました。

おまけ

上記で保存したファイルをSkitchで開くところまでをサービスとして登録する

上記のMyScreenshotForRetinaでは、画像を保存するところまででしたが、その後にSkitchで開くところまでを自動化することができるかというお話。

Skitchはターミナルから下記のコマンドを打つことで開くことができます。

> /Applications/Skitch.app/Contents/MacOS/Skitch

上記コマンドの後ろにファイル名を引数として与えることで、ファイルを開くことができます。

> /Applications/Skitch.app/Contents/MacOS/Skitch (filepath)

ということで、Automatorのシェルスクリプトに下記を書き込むことで実現が可能です。

fname="/Users/ky/Dropbox/Screenshots/"$(date +%Y%m%d%H%M%S)".png"
screencapture -io $fname
sips --resampleWidth $(sips -g pixelWidth $fname | sed 1d | awk '{x=$2;x=x/2;print x}') $fname
/Applications/Skitch.app/Contents/MacOS/Skitch $fname

ただし、上記には問題点があります。Skitchをコマンドから実行した場合、Skitchを終了しない限り(ウィンドウを閉じるだけじゃ駄目)、上記のサービスが終了しません。なので、スクリーンショットを撮るごとにSkitchを終了させておかないと、Skitihが複数立ち上がることになります。サービス自体も終了できず立ち上がりっぱなしになるので、それもよくありません。毎回「Cmd + Q」でSkitchを終了する人は使ってもいいかもしれません。