ブログに載せる画像はリサイズと圧縮しているんですが、手動でやるのが面倒くさいので、一括でリサイズ&圧縮できるスクリプトを作りました。
対象は、Macです。
できること
- 画像サイズを指定して変換できる
- 圧縮率を指定して変換できる
- Exif情報の削除
- JPEG, PNG, HEICに対応
- JPEGで出力
iPhoneで撮影した画像はHEIC形式になりますが、これも自動で変換できるようにしてあります。
スクリプトはgithubにも上げています。
https://github.com/yuh701/convert_img
事前準備 – jpegoptimをインストール
スクリプト内でJPEGを圧縮するために、jpegoptimを使います。
https://github.com/tjko/jpegoptim
homebrewでインストールしてください。
$ brew install jpegoptim
事前準備は、これだけです。
リサイズ&圧縮スクリプト 使い方
まずは、このスクリプトをconvertImg.shなどとして保存してください。
#!/bin/sh
IMG_WIDTH="800" # 画像の横幅を指定(px)
COMPRESS_RATE="70" # 画像の圧縮クオリティー、小さいほど、容量は小さくなるが画像が荒くなる。0~100で指定
INPUT_PATH=$1
TMP_OUTPUT_PATH="./tmp"
OUTPUT_PATH="./complete"
if [ $# != 1 ]; then
echo "引数に画像があるディレクトリパスを指定してください。例"
echo "/Users/hoge/Desktop/image"
exit 1
fi
cd $INPUT_PATH
if [ ! $? = 0 ]; then
echo "${INPUT_PATH}:ディレクトリに移動できませんでした。"
exit 1
fi
if [ ! -e $TMP_OUTPUT_PATH ]; then
mkdir $TMP_OUTPUT_PATH
fi
if [ ! -e $OUTPUT_PATH ]; then
mkdir $OUTPUT_PATH
fi
find . -iname '*.HEIC' | xargs -IT basename T .HEIC | xargs -IT sips --setProperty format jpeg ./T.HEIC --out $TMP_OUTPUT_PATH/T.jpg;
if [ ! $? = 0 ]; then
echo "HEICファイルを変換できませんでした"
exit 1
fi
find . -iname '*.png' | xargs -IT basename T .png | xargs -IT sips --setProperty format jpeg ./T.png --out $TMP_OUTPUT_PATH/T.jpg;
if [ ! $? = 0 ]; then
echo "pngファイルを変換できませんでした"
exit 1
fi
cp *.jpg *.jpeg $TMP_OUTPUT_PATH
find $TMP_OUTPUT_PATH -iname '*.jpg' -o -iname '*.jpeg' | xargs -IT basename T | xargs -IT sips -Z $IMG_WIDTH $TMP_OUTPUT_PATH/T --out $TMP_OUTPUT_PATH/T;
if [ ! $? = 0 ]; then
echo "ファイルを横:${IMG_WIDTH}pxにリサイズできませんでした"
exit 1
fi
rm $OUTPUT_PATH/*
jpegoptim --strip-all -m $COMPRESS_RATE -d $OUTPUT_PATH $TMP_OUTPUT_PATH/*
if [ ! $? = 0 ]; then
echo "画像圧縮できませんでした。"
exit 1
fi
beforeSize=`du -k $TMP_OUTPUT_PATH | cut -f 1`
afterSize=`du -k $OUTPUT_PATH | cut -f 1`
echo width=$IMG_WIDTH, 圧縮率=$COMPRESS_RATE
echo 合計削減サイズ:$((100-afterSize*100/beforeSize))%
echo $beforeSize $TMP_OUTPUT_PATH
echo $afterSize $OUTPUT_PATH
rm -r $TMP_OUTPUT_PATH
IMG_WIDTHとCOMPRESS_RATEで画像サイズと圧縮率を変更できるので、必要に応じて変更してください。
- IMG_WIDTH リサイズしたい画像横サイズ(px)
- COMPRESS_RATE 圧縮率
- 0~100の間で指定可能で、数値が小さいほど画像は荒く、容量は小さくなる。
- 70~80くらいが丁度いい。
実行は、以下のように画像があるディレクトリを指定します。
$ bash convertImg.sh <画像があるディレクトリ>
指定したディレクトリの下のcompleteというディレクトリが作成されて、そこに変換された画像が生成されます。
Exif情報(画像のメタデータ)の削除も行っているので、自宅で撮影した写真の位置情報からバレるというというような心配もなくなります。
以上です。
(例) 画像をリサイズ&圧縮してみる
実際にやってみます。
リサイズ圧縮したいHEIC, JPG, PNGファイルを用意します。
正常にコマンドが実行されると、合計削減サイズなどが表示されます。
$ bash convertImg.sh ~/Desktop/image
少し処理の話をしておくと、元画像をリサイズだけしたものをtmpディレクトリに作成して、それを圧縮してcompleteに作成しています。
なので、合計削減サイズの55%というのは、リサイズした画像を圧縮したときの削減サイズなので、元画像からの削減サイズではないのでご注意ください。
completeフォルダ内に変換された画像が作成されます。
画像サイズ800、圧縮率70だと画像容量は大体50KB前後になります。
ぱっと見では荒さは目立ちませんね。
もっと容量を削減したい場合は、圧縮率を10とかに下げれば5KBくらいの画像になります。
必要に応じて変更してみてください。
Macで一括画像リサイズ&圧縮 まとめ
今回は、Macで一括画像リサイズ&圧縮するスクリプトを作成してみました。
WordPressでブログを書いているとプラグインで画像圧縮してくれるものもありますが、やっぱり手元で変換したいので、重宝しています。
注意点として、全部JPGに変換するので、PNG透過画像の場合は透過情報が失われてしまいます。
自分で使う分には透過情報はいらないので特に実装する予定はないですが、要望があれば作ります。
(pull request歓迎)
他にもスクリプト公開していたり、エンジニア向けの情報を発信していますので、よろしくお願いします。
オススメ記事
> 150冊以上の中から”本当に役立つ”プログラミング本を紹介します
コメント