PNG画像を圧縮するとき、TinyPNGを使っている方も多いかと思います。 こちらのサイト、便利ではあるのですが、無料で使うには制約があります(最大5MBのファイルを、最大20個まで一度に圧縮できる)。また、インターネットの通信状況によっては、圧縮したファイルが得られるまでに時間がかかったりします。 今回は、TinyPNGを使わなくても、pngquantやImageMagickとAutomatorを組み合わせて、画像圧縮を効率化する方法を紹介します。こちらの方法を使えば、インターネット回線の状況に依存せず、外部のサイトに画像を送ることによるセキュリティの心配もありません。

完成形

完成形の動画

画像ファイルを右クリックしてコンテキストメニューを表示します。クイックアクションのリストから、画像圧縮のために作成したAutomatorのワークフローを選択するだけで、変換が完了です!

環境の前提と手順

Automatorを使用するので、macOSの環境が前提です。 また、pngquant/ImageMagickをインストールするために、Homebrewを使用します。

  • macOS
  • Homebrew
    • pngquant
    • ImageMagick

pngquant/ImageMagickのインストール

Homebrewを使用して、pngquantまたはImageMagickをインストールします。お好みのものをインストールすると良いです。 もし検討がつかなければ、pngquantをインストールするだけで十分でしょう。

pngquant

pngquantは、コマンドラインで使用できるPNG画像の非可逆圧縮ライブラリです。 メジアンカット法で画像の色数を減らしつつ、そのアルゴリズムの弱点を補う技術で、画像の風合いは維持したまま圧縮できるとのこと。

インストールコマンドは、brew install pngquantです。

ImageMagick

ImageMagickは、画像の表示や操作、編集を行える高機能なコマンドラインツール群です。 100を超える種類の画像形式に対応しているのが特徴。全部の機能を把握するのは難しいです。

インストールコマンドは、brew install imagemagickです。

Automator書類の作成

ここからが作業の本番です。手順はそんなに多くはないので、安心してください。

新規書類は「クイックアクション」で

Automatorを起動して、新規書類の作成を選択すると、書類のタイプを選択する画面が出てきます。 今回は「クイックアクション」を選択します。

クイックアクションを選択する

ワークフローの入力を設定する

ここでは、どのようなファイルを選択したときにこのワークフローを表示するかを設定します。 今回作成するクイックアクションは、画像を変換するだけなので、以下のように設定します。

通知をアクションに追加する

ワークフローが受け取る現在の項目は「イメージファイル」。検索対象は「Finder」を選択します。

ワークフローを組み立てる

「シェルスクリプトを実行」というアクションを、ワークフローに追加します。 まず、ウィンドウ左の「ライブラリ」カラムで、「シェルスクリプトを実行」というアクションを探します。検索バーに「シェル」と入力してアクションを絞り込むと簡単です。アクションが見つかったら、それをドラッグ&ドロップしてワークフローに配置します。

シェルスクリプトを実行を、ワークフローに追加

アクションの設定

アクションでは、いくつかの項目を設定します。 まず、「入力の引き渡し方法」の項目は「引数として」を選択します。入力されるデータは、ファイルパスの配列です。 つぎに、スクリプトの実行に使用するシェルを選択します。シェルによっては引数の扱い方が異なる可能性があるので、環境ごとに読み替えてください。 この記事では、bashまたはzshを想定しています。

シェルスクリプトを実行のアクションを設定

スクリプトを実装

それでは、画像変換用のスクリプトを実装していきます。もちろん、pngquantを使用する場合とImageMagickの場合では、スクリプトが異なりますので、使用するツールのスクリプトをコピペしてください。

pngquant の場合

pngquantを使用する場合は、以下のスクリプトをアクションにコピペしてください。

/usr/local/bin/pngquant --force $@

このコマンドは、--forceのオプションが付いているので、画像圧縮後に元のファイルを上書きします。 もし、元のファイルを残しておきたい場合は--forceのオプションを外してください。 この場合、圧縮後のファイルは、ファイル名の末尾が-or8.pngもしくは-fs8.pngとして、別ファイルで保存されます。ファイル名や末尾の文字列を設定することも可能です。

pngquantには、圧縮率を指定するパラメータががいくつかあります。 pngquant -hコマンドで、使えるオプションが表示されるので、好みの設定を探してみるとよいでしょう。

ImageMagickの場合

ImageMagickを使用する場合は、convertコマンドを使用します。ImageMagickのコマンドラインツールの1つです。 以下のコマンドをコピペします。

/usr/local/bin/convert $@ -strip -alpha Remove $@

このコマンドの動作は、PNGに付加されているコメント情報などを削除し(-strip)、アルファチャンネルを削除(-alpha Remove)します。 また、$@が2回現れますが、左の$@が入力ファイル、右の$@が出力先のファイルを意味しています。すなわち、元のファイルを、変換後のファイルで上書きする挙動になります。 もし、上書きしたくない場合は、ファイル名を変更するために工夫が必要です。

また、ImageMagickは、コマンドに複数のファイルを入力することができません。そのため、複数のファイルを指定して一気に実行したい場合は、スクリプトをちょっと工夫する必要があります。

上書きしたくない場合

とりあえず変換前と変換後で別のファイル名にするだけであれば、以下のコマンドで可能です。

DIRNAME=`dirname $@`
BASENAME=`basename $@`
PREFIX=converted_
/usr/local/bin/convert $@ -strip -alpha Remove ${DIRNAME}/${PREFIX}${BASENAME}

複数のファイルを受け取りたい場合

ImageMagicは、pngquantと異なり、コマンドで複数のファイルを受け付けることができません。 そのため、繰り返し構文を使用したスクリプトにする必要があります。

for FILE in $@
do
  DIRNAME=`dirname $FILE`
  BASENAME=`basename $FILE`
  PREFIX=converted_
  /usr/local/bin/convert $FILE -strip -alpha Remove ${DIRNAME}/${PREFIX}${BASENAME}
done

その他のオプション

ImageMagickには、便利なオプションが他にもあります。たとえば、-resize。アスペクト比を維持しながら、最大の幅x最大の高さの範囲に収まるようにリサイズしてくれます。

(例)convert input.png -resize 1000x1000 output.png(input.pngを、アスペクト比を維持しながら1000x1000の範囲に収まるようにリサイズし、output.pngに保存する)

最後に、通知をアクションに追加

ファイルを上書きする場合、処理の終了がわかりにくいので、通知を表示するようにします。 ライブラリから「通知を表示」のアクションをワークフローに追加します。

通知をアクションに追加する

処理の終了をお知らせするテキストを設定したら、これで完成!

まとめ

AutomatorとpngquantやImageMagickを組み合わせて、PNG画像の圧縮作業を効率化する方法を紹介しました!Automatorは、シェルスクリプトでできることはほとんど自動化できるので、とても便利ですね!Automatorは、シェルスクリプトをサービスに登録できる一方、パラメータの受け取りは苦手です。パラメータを調整してスクリプトを実行したくなった場合は、自分でシェル関数を定義するほうが楽なことも少なくありません。それぞれの作業スタイルに応じて、Automatorを使うかは判断する必要がありそうです。