Imagemagickを使用して、特定のアスペクト比に合うように、最小限の方法で画像をトリミングしたいと思います。
例:たとえば、3038 x 2014 pxの画像がある場合、アスペクト比が3:2になるようにトリミングします。結果の画像は、たとえば元の画像の中心からトリミングされた3021 x 2014pxになります。
したがって、convert in.jpg -gravity center -crop_to_aspect_ratio 3:2 out.jpg
のようなコマンドを探します。
最後の目標が特定の解像度(たとえば1920x1080)にすることである場合は、-geometry
、曲折アクセント記号/帽子/屋根/家の記号(^
)および-crop
を使用すると簡単です。 :
convert in.jpg -geometry 1920x1080^ -gravity center -crop 1920x1080+0+0 out.jpg
複数のjpgファイルをループするには:
for i in *jpg
do convert "$i" -geometry 1920x1080^ -gravity center -crop 1920x1080+0+0 out-"$i"
done
スケーリングを避けたい場合は、Imagemagickの外側のトリミングされた辺の新しい長さを計算する必要があります。これはもっと複雑です:
aw=16 #desired aspect ratio width...
ah=9 #and height
in="in.jpg"
out="out.jpg"
wid=`convert "$in" -format "%[w]" info:`
hei=`convert "$in" -format "%[h]" info:`
tarar=`echo $aw/$ah | bc -l`
imgar=`convert "$in" -format "%[fx:w/h]" info:`
if (( $(bc <<< "$tarar > $imgar") ))
then
nhei=`echo $wid/$tarar | bc`
convert "$in" -gravity center -crop ${wid}x${nhei}+0+0 "$out"
Elif (( $(bc <<< "$tarar < $imgar") ))
then
nwid=`echo $hei*$tarar | bc`
convert "$in" -gravity center -crop ${nwid}x${hei}+0+0 "$out"
else
cp "$in" "$out"
fi
例では16:9を使用しており、ほとんどの読者にとって3:2よりも役立つと期待しています。ソリューション1の1920x1080
またはaw
/の両方の出現箇所を変更してください。ソリューション2のah
変数を使用して、目的のアスペクト比を取得します。
ImageMagick 7の登場により、FX式を使用して、1つのコマンドでアスペクト比を指定して可能な最大の画像サイズにトリミングすることができます。
唯一の秘訣は、同じコマンドの4つの異なる場所に目的のアスペクトを入力する必要があるため、そのビットの変数を作成するのが最も簡単だと思います。アスペクトは、fx式が解決できる文字列としての10進数または分数にすることができます。
aspect="16/9"
magick input.png -gravity center \
-extent "%[fx:w/h>=$aspect?h*$aspect:w]x" \
-extent "x%[fx:w/h<=$aspect?w/$aspect:h]" \
output.png
アスペクトが正しければ、2つの-extent
操作を-resize
でフォローアップして、完成した画像を出力サイズにすることができます。上記の例では、入力画像を指定できる限り大きくしています。
必要な寸法を計算してから、トリミングを行う必要があります。これは、画像のwidth
とheight
に加えて、必要なアスペクト比をaspect_x
とaspect_y
として指定すると、Imagemagickで使用できるトリミング文字列を出力する関数です。 。
def aspect(width, height, aspect_x, aspect_y)
old_ratio = width.to_f / height
new_ratio = aspect_x.to_f / aspect_y
return if old_ratio == new_ratio
if new_ratio > old_ratio
height = (width / new_ratio).to_i # same width, shorter height
else
width = (height * new_ratio).to_i # shorter width, same height
end
"#{width}x#{height}#" # the hash mark gives centre-gravity
end
Dragonfly Gemを使用するアプリケーションで、これに似たものを使用しています。
非常に長い画像をA4(1x1.414)の紙のアスペクト比で垂直に分割する必要がありました。だから私は以下の解決策を思いついた。画像のファイル名がch1.jpgであると仮定します。
convert -crop $(identify -format "%w" ch1.jpg)x$(printf "%.0f" $(echo $(identify -format "%w" ch1.jpg) \* 1.414|bc)) +repage ch1.jpg ch1.jpg