サイトロゴ

ImageMagickで画像加工|シェル

著者画像
Toshihiko Arai

はじめに

macOSでImageMagickを使用するための基本的な手順をご紹介いたします。macOSには画像加工処理のできるsipsコマンドが標準で備わっています。ですが、Linuxをはじめ他のOSでも使えるImageMagickを覚えた方が長い目でみたら損はないと思います。

ImageMagickのインストール

macOSにImageMagickをインストールするには、Homebrewを使用するのが一般的です。まずはHomebrewがインストールされていることを確認し、次に以下のコマンドを実行します。

パッケージ バージョン インストールコマンド
ImageMagick 7.1.1-29 brew install imagemagick

ImageMagickの基本的な使い方

ImageMagickには多数のオプションがあり、画像の変換、編集、作成などが可能です。ここでは、基本的な使い方とよく使用されるオプションを紹介します。

コマンド 説明
convert 画像の形式を変更する convert input.png output.jpg
mogrify 画像を上書きして変更する mogrify -resize 100x100 input.jpg
-resize 画像のサイズを変更する convert input.jpg -resize 50% output.jpg
-crop 画像を切り抜く convert input.jpg -crop 300x300+10+20 output.jpg
-gravity 位置を指定して操作する(例: クロップ、トリム) convert input.jpg -gravity center -crop 100x100+0+0 output.jpg
-quality JPEGの品質を指定する convert input.png -quality 80 output.jpg
-rotate 画像を回転させる convert input.jpg -rotate 90 output.jpg
-colorspace 色空間を変更する convert input.jpg -colorspace Gray output.jpg

【実践編】HEIC画像をJPEGに変換する

iPhoneで撮った写真が HEIC になってしまうので、jpgへ変換したい場合は次のように実行します。

convert input.heic output.jpg

または、

magick input.heic output.jpg

次は、ディレクトリ内の .heic.HEIC を一括でJPEGに変換するワンライナーです:

for file in *.[hH][eE][iI][cC]; do convert "$file" -quality 80 "${file%.*}.jpg"; done

macOSの.zshrcにエイリアスを設定しておくと非常に便利です。iPhoneの写真をmacOSで使いたい場合に、大抵heicファイルですから。それらを一括でjpg変換できます。

alias heic='for file in *.[hH][eE][iI][cC]; do magick "$file" -quality 80 -define jpeg:extent=2MB "${file%.*}.jpg"; done'

【実践編】4:3画像を16:9のアスペクト比でくり抜く

magick input.heic -gravity center -crop 16:9 +repage output.jpg

【応用編】アスペクト比を保ってスケール変換

よく使う処理は、次のように関数にまとめておくと便利です。アスペクト比を保って画像のスケール変更し、さらにpngファイルの場合は背景を白にしてjpgファイルへ出力します。

#!/bin/bash

scale_craft() {
    input_path="$1"
    width="$2"
    height="$3"
    quality="$4"
    output_path="$5"

    # 出力先ディレクトリを作成(存在しない場合)
    output_dir="$(dirname "$output_path")"
    mkdir -p "$output_dir"

    magick "$input_path" -resize "${width}x${height}" -background white -alpha remove -alpha off -quality "$quality" "$output_path"

#
}

if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
    input="/Users/mopipico/Desktop/a.png"
    output="/Users/mopipico/Desktop/out.jpg"
    scale_craft "${input}" 1200 800 85 "${output}"
    #scale_craft "${input}" 0.5 85 "${output}"
fi

【応用編】文字を入れてサムネを作る

```bash #!/bin/bash

function thumb_craft() { local TITLE=“$1” local SUB_TITLE=“$2” local BICOLOR=“$3” local TEXT_COLOR=“$4” local OUTPUT=“$5”

# フォント(システムに応じて調整)
FONT_TITLE="/System/Library/Fonts/ヒラギノ角ゴシック\ W5.ttc"
FONT_SUB="/System/Library/Fonts/ヒラギノ角ゴシック\ W5.ttc"
#FONT_TITLE="/Users/mopipico/Library/Fonts/yawarakadragon.otf"
#FONT_SUB="/Users/mopipico/Library/Fonts/yawarakadragon.otf"


# 画像サイズ
WIDTH=1200
HEIGHT=630


if [[ -z "$SUB_TITLE" ]]; then
    # サブタイトルがない場合:タイトルを中央に
    magick -size ${WIDTH}x${HEIGHT} canvas:"${BICOLOR}" \
        -font "$FONT_TITLE" -fill "$TEXT_COLOR" -pointsize 64 -gravity center \
        -annotate +0+0 "$TITLE" \
        "$OUTPUT"
else
    # サブタイトルがある場合:タイトルを上に、サブタイトルを下に
    magick -size ${WIDTH}x${HEIGHT} canvas:"${BICOLOR}" \
        -font "$FONT_TITLE" -fill "$TEXT_COLOR" -pointsize 64 -gravity center \
        -annotate +0-50 "$TITLE" \
        -font "$FONT_SUB" -pointsize 32 -annotate +0+60 "$SUB_TITLE" \
        "$OUTPUT"
fi

}

if [[ “${BASH_SOURCE[0]}” == “$0” ]]; then

# YAMLファイルのパス
for YAML_FILE in /somewhere/*.yml; do
    # ディレクトリとベースファイル名を取得
    dir_name=$(dirname "$YAML_FILE")
    base_name=$(basename "$YAML_FILE" .yml)

    # YAMLから値を読み取る
    title=$(yq '.title' "$YAML_FILE")
    sub_title=$(yq '.sub_title' "$YAML_FILE")
    bgcolor=$(yq '.bgcolor' "$YAML_FILE")
    text_color=$(yq '.text_color' "$YAML_FILE")

    # 出力ファイルパス(同じディレクトリに出力)
    output="${dir_name}/${base_name}.png"

    # サムネイル生成
    thumb_craft "${title}" "${sub_title}" "${bgcolor}" "${text_color}" "${output}"
done

fi

関連記事