【Mac】ターミナルで画像のリサイズ

画像のリサイズ程度のことで、プレビュー.app を立ち上げるのはダルい。
 ファイル名を考えるのもダルい。
 もっとスパっと簡単にできんものか。という場合にゆきつくのがターミナルである。

sips

macOS の bash でイメージのリサイズをする場合、sips というコマンドが有用だ。
 macOS には最初からインストールされている。

--resampleWidth ピクセル数
# 横幅をピクセル数にリサイズする。縦横比は保たれる。
sips --resampleWidth 600 image.png --out resize-image.png

--resampleHeight ピクセル数
# 高さをピクセル数にリサイズ、縦横比は保たれる。
sips --resampleHeight 480 image.png --out resize-image.png

他のオプションについては、この記事で紹介したこともある。
 しかし sips のリサイズには不満があったりする。アンシャープマスクをかけられないのだ。

こんな感じにボケでしまう。

imagemagick

やっぱ、bash で画像をイジるなら imagemagick の力を素直に借りるのが良さそう。
 Homebrew でインストールできる。

brew install imagemagick

リサイズに関してはこんなふうに書くらしい。

convert input_image.png -resize 600x600 output_image.png

600x600 の x は小文字のエックスだ。縦横どちらか長いほうの辺を 600px にするという意味である。アスペクト比は保たれる。
 リサイズについてはシンプルで使いやすい。
 問題はアンシャープだ。こんなふうに書くみたいだ。

-unsharp 0x1+1+0.008
# convert ボケたinput.png -unsharp 0x1+1+0.008 キリッとしたoutput.png

0x1+1+0.008 というのはなんなのか。
「半径xディテール+適用量+しきい値」
 ということらしいのだが、難しい。このうち最初の半径は 0 にしておくと imagemagick のほうで適切な数値にしてくるとのこと。

面倒くさくない書き方もある。

-sharpen 1
# convert ボケたinput.png -sharpen 1 キリッとしたoutput.png

ざっくりだけど、ブログとかで使うちょっとした画像なら、これでだいたいスッキリする感じ。

resize.sh

自分の使い道にあわせて、以下のようなスクリプトを書いた。

📝 resize.sh

#!/bin/sh

# 画像をリサイズするやつ
# -r 600
# とやれば、幅 600 ピクセルにしてくれる。
# -h
# で半分のサイズにしてくれる。

argcheck='off'
half='off'
for arg in "$@"
do
    if test "$argcheck" = 'on'; then
        resize="$arg"
        argcheck='off'
    fi
    if test "$arg" = '-r'; then
        argcheck='on'
    fi
    if test "$arg" = '-h'; then
        half='on'
    fi
    if echo "$arg" | grep -sqEi 'jpg|png|jpeg|gif'; then
        img="$arg"
    fi
done

if test -z "$img"; then
    echo 'No Image'
    exit 0
fi

if test "$half" = 'on'; then
    w=`sips -g pixelWidth "$img" | grep 'pixelWidth' | sed -e 's/pixelWidth\://' -e 's/ //g'`
    resize=`echo $((w / 2))`
fi

if test -z "$resize"; then
    echo 'Not number'
    exit 0
else
    ext=`echo ${img##*.}`
     imgFile=`echo ${img%.*}`
     convert "$img" -resize "$resize"x"$resize" -sharpen 1  "$imgFile"_"$resize"px."$ext"
fi

ちなみに、resize.sh -r 40% image.png みたいにパーセントでもリサイズできる、はず。