私のディレクトリにはいくつかの画像ファイルがあります。画像のサイズは似ており、背景色も同じです。
添付画像のように背景を追加してすべての画像を同じサイズにするにはどうすればよいですか?
答え1
これは、ImageMagickが他を*.png
指定せずに処理できるすべての画像タイプに対して機能します。*.jpg
*.jpeg
#!/bin/bash
images=$(identify -format '%f\n' * 2>/dev/null)
IFS=$'\n'
set -e
max_dims=$(
identify -format '%w %h\n' $images 2>/dev/null |
awk '($1>w){w=$1} ($2>h){h=$2} END{print w"x"h}'
)
orig_dir=originals_$(date +%Y-%m-%d_%T)
mkdir "$orig_dir"
mv -- $images "$orig_dir"
cd "$orig_dir"
set +e
for image in $images; do
convert -- "$image" -gravity Center -extent "$max_dims" "../$image"
done
結果が理想的でない場合は、元の画像が古いディレクトリに移動されます。また、何らかの理由でイメージファイル名に改行文字が含まれていると、この操作は失敗します。
スクリプトは、問題が発生したときに便利な表示を提供するために追加のエラーメッセージを処理できます。ただし、現在の画像(set -e
およびその間のすべての項目set +e
)の移動中にエラーが発生すると、スクリプトは終了します。これにより、元に戻せないダメージが発生しないことを願います。
修正する
今awk
シナリオは恥ずかしく盗まれました。@terdonの返信。
答え2
選択したターゲットサイズが最大の画像より大きい場合は、次を使用してもかまいません。
mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png
上記のコマンドソースファイルを変更します、実行する前にバックアップを作成したい場合があります。 ImageMagickを使用して白い背景()を追加し、画像を中央に配置(mogrify
)して、現在のディレクトリのすべてのpngサイズを200 x 200ピクセル()に調整します。同様の間違いを避けるべきです-extent 200x200
-background black
-gravity Center
-colorspace RGB
mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present `emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754.
画像データが失われないようにするには、使用するサイズが最大の画像以上であることを確認してください。この結果をすばやく取得するには、以下を試してください。
file *png | awk -F, '{print $2}' | sort -nu
これにより、整列されたすべての画像のサイズが印刷され、最大の画像を簡単に見つけることができます。
Goldilocks(:P)を癒すためにプロセス全体を自動化できます。
dimensions=$(file *png | cut -d, -f 2 | sort -u |
awk '($1>w){w=$1}($3>h){h=$3}END{print w"x"h}') &&
mogrify -gravity Center -extent $dimensions -background white -colorspace RGB *png;
答え3
私はbashのスキルを向上させる機会を得て、次のことを思い出しました。
#!/bin/bash
maxx=0
maxy=0
# find largest dimension
for file in *.jpg ; do
dim=$(identify "$file" | awk '{ print $3 }')
xdim=$(echo $dim | cut -f1 -dx)
ydim=$(echo $dim | cut -f2 -dx)
if [ $xdim -gt $maxx ] ; then
maxx=$xdim
fi
if [ $ydim -gt $maxy ] ; then
maxy=$ydim
fi
done
mkdir bordered
# resize and store new images in new folder
for file in *.jpg ; do
dim=$(identify "$file" | awk '{ print $3 }')
xdim=$(echo $dim | cut -f1 -dx)
ydim=$(echo $dim | cut -f2 -dx)
xborder=$(( ($maxx - $xdim ) / 2 ))
yborder=$(( ($maxy - $ydim ) / 2 ))
convert "$file" -bordercolor black -border ${xborder}x${yborder} "bordered/$file"
done
これによりトリックが実行されます。まず、すべてのファイルを繰り返し(必要に応じて部分を変更)、最大幅と高さを見つけて、もう一度繰り返して必要な境界を追加します(必要に応じて部分を変更-bordercolor black
)。新しいファイルは「ボーダー」フォルダに保存されます。