ImageMagickで画像加工|シェル
はじめに
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
関連記事
- 【Pythonでサムネ制作②】PILで画像の上に透過画像を重ねる
- 【Pythonでサムネ制作①】PILで画像の上に文字を重ねて中央表示
- fdupes で内容が重複しているファイルを見つける|シェル
- ESP32でSPIFFS領域に保存する方法【M5StickC PLUS】
- Diagramsを使ってサクッとインフラ図を描く【Python】