Hirosaji Tech Blog 🍙

Web開発の記事が多め。絵師支援の記事も少し。

ワンライナーでWebに最適な画像に変換する

何を作ったの

画像をWeb用に最適化するシェルスクリプトを作りました。

このスクリプトを使えば、視覚的な品質を保ちつつ、画像を軽量化できます。

なぜ作ったの

自身のイラストを掲載するポートフォリオサイトを高速化したかったからです。

hirosaji-portfolio.com

作ったもの

ソースコード

結構シンプルです。

#!/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形式に変換する予定です。
変換自体は極めて簡単なので、これはフロント側の準備ができ次第。

参考リンク