LoginSignup
0
0

More than 1 year has passed since last update.

iPhoneで撮影した画像(.HEIC)をPNGに自動で変換し、良い感じに圧縮する(Mac)

Last updated at Posted at 2021-10-03

やりたいこと

  • 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で不要なメタデータを削除する(場合によっては消した方が良いかも?)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0