何を作ったの
画像をWeb用に最適化するシェルスクリプトを作りました。
このスクリプトを使えば、視覚的な品質を保ちつつ、画像を軽量化できます。
なぜ作ったの
自身のイラストを掲載するポートフォリオサイトを高速化したかったからです。
作ったもの
ソースコード
結構シンプルです。
#!/bin/sh CMDNAME=`basename $0` if [ $# -ne 1 ]; then echo "Usage: $CMDNAME file_name" 1>&2 exit 1 fi echo "Processing: $1" # optimize convert $1 -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB optimized_image.jpg # resize v=$(identify -format "%w,%h" $1) list=(${v//,/ }) if [ ${list[0]} -ge ${list[1]} ]; then mogrify -resize x1500 optimized_image.jpg else mogrify -resize 1500x optimized_image.jpg fi exit 0
実行例
最適化する画像のパスを引数にして、スクリプトを実行します。
$ sh optimize_image.sh <image_path>
実行後、optimized_image.jpg
という最適化された画像が出力されます。
解説
要点ごとに分割して解説します。
CMDNAME=`basename $0` if [ $# -ne 1 ]; then echo "Usage: $CMDNAME file_name" 1>&2 exit 1 fi
前半のこの箇所で、引数の数を判定しています。 引数が1つ含まれている時以外は、エラーメッセージを返します。
convert $1 -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB optimized_image.jpg
次に、この部分で画像を最適化します。(要・ImageMagick)
画像を最適化する際のパラメータは、 Google Pagespeed Insights を参考にしました。
v=$(identify -format "%w,%h" $1) list=(${v//,/ }) if [ ${list[0]} -ge ${list[1]} ]; then mogrify -resize x1500 optimized_image.jpg else mogrify -resize 1500x optimized_image.jpg fi
最後に、画像をリサイズします。
この例では、変換前に画像の縦/横幅を取得し、縦/横幅の短い方を基準に 1500px まで縮小するよう分岐処理しました。
変換前後の比較例
実行例として、私のイラストを最適化した例を載せます。
比較対象
比較表
元画像 | 最適化後(convert) | リサイズ後(mogrify) |
2.13MB | 1.15MB | 0.55MB |
よく見ると、加工後に色味の変化やブロックノイズが発生しています。
この辺り、どこまで許容できるかがで、パラメータが決まります。
用途に合わせて、適宜調整してみましょう。
今後の予定
Jpeg -> Webp形式に変換する予定です。
変換自体は極めて簡単なので、これはフロント側の準備ができ次第。