web-dev-qa-db-ja.com

ImageMagick:画像を特定のアスペクト比に最小限にトリミングする方法は?

Imagemagickを使用して、特定のアスペクト比に合うように、最小限の方法で画像をトリミングしたいと思います。

例:たとえば、3038 x 2014 pxの画像がある場合、アスペクト比が3:2になるようにトリミングします。結果の画像は、たとえば元の画像の中心からトリミングされた3021 x 2014pxになります。

したがって、convert in.jpg -gravity center -crop_to_aspect_ratio 3:2 out.jpgのようなコマンドを探します。

25

1.特定のターゲット解像度

最後の目標が特定の解像度(たとえば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

2.アスペクト比のトリミングのみ

スケーリングを避けたい場合は、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変数を使用して、目的のアスペクト比を取得します。

20
qubodup

Imagemagickの最近のバージョン(6.9.9-34以降)にはアスペクトクロップがあります。だからあなたはすることができます:

入力:

enter image description here

convert barn.jpg -gravity center -crop 3:2 +repage barn_crop_3to2.png

enter image description here

出力は400x267 + 0 +0です。ただし、PNG出力は仮想キャンバスをサポートしているため、400x299 + 0 +16の仮想キャンバスを削除するには+ repageが必要であることに注意してください。 JPG出力は仮想キャンバスをサポートしていないため、+ repageは必要ありません。

15
fmw42

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でフォローアップして、完成した画像を出力サイズにすることができます。上記の例では、入力画像を指定できる限り大きくしています。

3
Caleb

必要な寸法を計算してから、トリミングを行う必要があります。これは、画像のwidthheightに加えて、必要なアスペクト比をaspect_xaspect_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を使用するアプリケーションで、これに似たものを使用しています。

1
starfry

非常に長い画像を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
0
Rovshan