[Mac, Retina, Automator]スクショ(png)のファイルサイズが大きいから圧縮してからメール添付してるけど、面倒なので自動化してみた


タイトルのまんまですが（汗）、
Retina Macのスクショは、メール添付するには無駄にでかいです。

そこでいつも [ImageOptim](https://imageoptim.com/mac) で該当のスクショ画像を圧縮してました。

- [ImageOptim](https://imageoptim.com/mac)を起動
- スクショ保存フォルダを開く
- 該当スクショを [ImageOptim](https://imageoptim.com/mac) にドラッグ
- 圧縮されるのを待つ

っていうたいした作業じゃないですが、頻度が増えると意外と面倒くさい。。

なので前から自動化したいと思っていました。

## 参考にさせていただいた先生がたのページ

[Raugh](http://qiita.com/Raugh) さんの [MACでフォルダ内の画像を一括でリサイズする方法](http://qiita.com/Raugh/items/59e24d7930b3e2cefaaf)

[ImageOptim-CLI で画像ファイルを最適化する](https://www.d-wood.com/blog/2013/12/12_5109.html)

[ImageOptim-CLI - JPEGmini for Macをコマンドラインから操作することができる圧縮ツール](http://www.softantenna.com/wp/review/imageoptim-cli/)


## やりたいこと

スクショを保存するフォルダは決めているので、
そのフォルダに画像が追加されたら検知して自動で圧縮する。


## 手順

- ImageOptim-CLIのインストール
- Automatorでタスク作成


### ImageOptimーCLIのインストール

以下のコマンドでインストールします。

```bash
$ npm i -g imageoptim-cli
```

環境変数に入っているかを確認してみる

```bash
$ imageoptim -v
1.14.8
```
※僕がインストールした時のバージョン表示

ついでにヘルプも見てみる

```bash
$ imageoptim -h

Options:

  -d, --directory       directory of images to process
  -a, --image-alpha     pre-process PNGs with ImageAlpha.app *
  -j, --jpeg-mini       pre-process JPGs with JPEGmini.app **
  -m, --min-quality     pngquant min quality parameter
  -s, --skip-if-larger  pngquant use --skip-if-larger
  -q, --quit            quit all apps when complete
  -c, --no-color        disable color output
  -h, --help            display this usage information
  -e, --examples        display some example commands and uses
  -v, --version         display the version number
  --verbose             display detailed, per-file info on optimizations

*  http://pngmini.com
** https://itunes.apple.com/us/app/jpegmini/id498944723

```
ヘルプにはちゃんと書かれてませんが、ファイル単位で圧縮したい場合はパイプで渡します。

↓こんな感じです。

```bash:ImageOptim-CLIにファイルを渡す場合
$ find ~/hoge -name "*_fuga.png" | imageOptim -a
```

※ディレクトリを指定する場合は ```-d``` オプションを使用して引数として渡します。


### Automatorでタスク作成

#### アクション作成手順

1. Automatorを起動
2. ```Cmd+N``` で新規作成
3. 作成する書類（アクション）の種類を選択
4. 作業開始していいかの確認ダイアログを作る
5. 圧縮アクションを作る
6. 完了通知ダイアログを作る
7. テスト

##### 1. Automatorを起動

> アプリケーション > Automator


##### 2. ```Cmd+N``` で新規作成

> メニュー > 新規作成

でもOK

##### 3. 作成する書類（アクション）の種類を選択 

今回は

> スクショを保存するフォルダは決めているので、
> そのフォルダに画像が追加されたら検知して自動で圧縮する。

がやりたいことなので、「フォルダアクション」を選択。

![フォルダアクションを選択](https://qiita-image-store.s3.amazonaws.com/0/130681/fb1b1bb7-451f-1d16-55c9-da89786890aa.png "Automator-SS00.png")



##### [小休止]画面説明！

フォルダアクション選択後に表示される画面の説明をしておきます。
※他を選んでも基本同じ画面です。

![Automatorのメイン画面](https://qiita-image-store.s3.amazonaws.com/0/130681/442247d2-49ac-701a-927f-5705d55430a3.png "Automator-SS03.png")

↑
こんな感じです。

基本操作としては、

- ライブラリ列から利用したいアクションが入っているであろうライブラリを選択
- アクションリスト列で該当のアクションを見つける
- ドラッグしてワークフローエリアに入れる

という感じです。

名前で検索もできますが、うまくヒットしなかったりするのでググったほうが早いかもです。



##### 4. 作業開始していいかの確認ダイアログを作る

> ユーティリティ > 確認を求める

ワークフローエリアで確認ダイアログのタイトルとメッセージを入力します。


##### 5. 圧縮アクションを作る

画像の圧縮作業はImageOptimのコマンドライン版[ImageOptim-CLI](https://github.com/JamieMason/ImageOptim-CLI)で行うのでシェルスクリプトをアクションとしてワークフローエリアに入れます。

> ユーティリティ > シェルスクリプトを実行

入力の引き渡し方法は引数にします。

![入力の引き渡し方法](https://qiita-image-store.s3.amazonaws.com/0/130681/c9359b98-2f25-0463-ec40-bc5b4dec26f6.png "Automator-SS04.png")

スクリプトの中身は↓こんな感じです。

```bash:/bin/bash
for f in "$@"
do

fext=${f##*.}

if [ $fext = "png" ]; then
	find "$f" | /Users/{ユーザー名}/.nodebrew/current/bin/imageoptim -a
fi

done
```

※ nodebrewでnodeをバージョン管理しているので、↑このようなパスになっていますが、ImageOptimのフルパスは適宜変更してください。

```bash:インストールしたImageOptimのフルパス確認
$ which imageoptim
```



見つかった対象ファイル毎に、拡張子を調べて、pngだったらImageOptimで圧縮。
そうじゃなかったらスルーして次のファイルを処理。

って感じです。


##### 6. 完了通知ダイアログを作る

ImageOptimのpng圧縮処理は時間がかかるので、
終わったら「終わった」と教えてくれるようにします。

> ユーティリティ > 通知を表示

タイトル、サブタイトル、メッセージを入力します。
※タイトルとメッセージだけでよいと思います。


##### 7. テスト

デバッグしてみます。
右上にある「コマ送り」ボタンをクリックしながらアクション毎にテストします。

フォルダアクションの場合、該当フォルダにファイルが追加されたというデバッグ用アクションが必要ですがそういうのは無いので、別途最初のアクションとして「指定された Finder 項目を取得」を追加して、「フォルダアクションでファイルが取り込まれた」体（てい）を作ります。

> ファイルとフォルダ > 指定された Finder 項目を取得


一通りテストしてみて問題がなければ完成です。

スクショを取ったら（フォルダアクションで指定したフォルダにファイルが追加されたら）自動的にpng画像圧縮アクションが実行されます。

## まとめ

今回はpng画像に対してだけ行いたかったので、本当は作業開始確認の前に、追加されたファイルの種類判定を入れたほうがいいなと思いました。

また、解像度もでかいのでリサイズしてもいいかもと思いましたが、
でっかく使いたいこともあるので、リサイズは任意に実行するため右クリックメニューにしちゃおうかと思いました。

そちらはまた別途。