やりたいこと
- iPhoneで撮影した.HEICの写真をPNGに変換して、(資料用として)良い感じに使えるレベルに圧縮したい。
- iPhoneで.HEIC以外にも保存できるが、iPhoneの容量消費が早くなって嫌なので、PC上で圧縮したい
- (結果的にHEIC以外の多くの拡張子の画像ファイルをPNGに出来た)
1. 実現する方法
- MacのAutomatorから、フォルダアクションを利用する。
- シェルはzsh, フォルダアクションのフォルダは「automator_compressed」にした
- このフォルダにデータを入れるとその下層のoutputフォルダに変換後のデータが保存される
【準備】
事前にターミナルから必要なライブラリをインストールする
brew install imagemagick pngquant
/Users/(ユーザ名)/pictures/に、「automator_compressed」を作り、その中に「output」フォルダを作る(コマンドなら下記)
kawaguchi@KAWAGUCHI ~ % mkdir -p pictures/automator_compressed/output
【automatorのアクションを作る】
フォルダアクションの使い方は下記などを参照
Automatorのフォルダアクションを使った小技.ファイル自動振り分けとファイルの自動アップロード
シェルスクリプトを追加し、以下を入力(詳細は後述)
export PATH=$PATH:/opt/homebrew/bin
export UKPAO=/Users/kawaguchi/pictures/automator_compressed/output
for f in "$@"
do
mogrify -path $UKPAO -format png $f;
convert ${UKPAO}/${${f##*/}%.*}.png -resize 1920x1920 ${UKPAO}/${${f##*/}%.*}.png;
pngquant --speed 1 --ext .png --force ${UKPAO}/${${f##*/}%.*}.png;
open -a ImageOptim.app ${UKPAO}/${${f##*/}%.*}.png
done
workflowを保存したらFinderからフォルダアクションを設定し完了
画像をautomator_compressedに移動するだけでoutputフォルダに圧縮後の画像が保存される
2. スクリプトの内容・設定の詳細
当初のスクリプトは以下の通り(automatorでスクリプトを使用する場合、アクションの実行環境はターミナルの環境依存を継承しないらしいのでパッケージのパスを通す必要がある)
export PATH=$PATH:/opt/homebrew/bin
for f in "$@"
do
mogrify -format png $f;
pngquant --speed 1 --ext .png --force $f;
done
mogrifyでHEICをpngに変換し、同ディレクトリに保存して、pngquantで減色圧縮をしている。
一見問題ないように(自分には)見えるが、automator_compressedフォルダにファイルが増えるので、再度automatorのフォルダアクションが実行され、このスクリプトが再度実行され、無限ループに陥る。
そこで、圧縮したファイルは1階層深いoutputフォルダに保存することとした。
修正したスクリプトは下記(再掲)。
export PATH=$PATH:/opt/homebrew/bin
export UKPAO=/Users/kawaguchi/pictures/automator_compressed/output
for f in "$@"
do
mogrify -path $UKPAO -format png $f;
convert ${UKPAO}/${${f##*/}%.*}.png -resize 1920x1920 ${UKPAO}/${${f##*/}%.*}.png;
pngquant --speed 1 --ext .png --force ${UKPAO}/${${f##*/}%.*}.png;
open -a ImageOptim.app ${UKPAO}/${${f##*/}%.*}.png
done
スクリプト中の「f」には対象ファイル(.HEIC)のフルパスが入っているので、保存先はUKPAOで指定する。
また、fからファイル名(拡張子を除く)を取り出すために、シェルの変数展開(前方一致の最長マッチ##)を用いて${f##*/}でパスを削除し、更に後方一致${変数%.*}で拡張子を削除する。(ここまでが「${${f##*/}%.*}」もっと良いやり方があるかも。。)
全体の流れは、mogrifyで拡張子変換、outputフォルダへ出力、pngをconvertでリサイズ(決め打ちで1920に設定)し、pngquantで色情報を減らし、ImageOptimで不要なメタデータを削除する(場合によっては消した方が良いかも?)。