web-dev-qa-db-ja.com

ImageMagickでmorgifyを使用して北と中央をトリミングする方法

水平方向の中央に配置されているが、垂直方向の中央には配置されていない画像をトリミングする方法はありますか?たとえば、画像を切り抜く方法は次のとおりです。

expected

ただし、コマンドmogrify -crop 250x250 -gravity North cat.jpgを使用すると、次のようになります。

gotted

これは、サイズの異なる約10,000枚の画像を使用してバッチで実行するため、トリミングする正確な領域を明示的に選択することはできません。 。

3
Steven Jeffries

私の頭のてっぺんから、数学的には左上の0,0(別名:ImageMagickの用語ではNorthWest)から始まる座標を扱う必要があるので、クロップボックス領域をこのようなものになります:

(width of image - width of crop area) / 2

したがって、例のmogrifyコマンドを使用して、概念的に次のようなことを行うことができます。

mogrify -crop 250x250+[(width of image - 250)/2]+0 -gravity NorthWest cat.jpg

これはかなり素晴らしい概念ですが、有用な現実ではありません。しかし、私は少し実験して、これを単一のテスト画像で機能させることができました。

CROP_W=250
CROP_H=250
IMG_W=$(identify -format %w test.jpg)
X_OFFSET=$((($IMG_W-$CROP_W)/2))
mogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 -gravity NorthWest test.jpg

ImageMagickの-gravityのデフォルトはとにかくNorthWestなので、次のように-gravityオプションを完全に削除することで簡略化できます。

CROP_W=250
CROP_H=250
IMG_W=$(identify -format %w test.jpg)
X_OFFSET=$((($IMG_W-$CROP_W)/2))
mogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 test.jpg

そして、その概念をテストした後、このBashスクリプトを作成しましたが、期待どおりに機能します。 DIRECTORY値を変更して、操作する予定の実際のディレクトリに一致させます。そして、そのecho mogrifyを使用すると、コマンドが実行された場合に何が起こるかを正確に確認できます。そのechoを削除し、満足のいく結果が得られたら、スクリプトをそのままにします。

#!/bin/bash

# Set the crop width and height.
CROP_W=250
CROP_H=250

# Set the directory to act on.
DIRECTORY='/path/to/images'

# Use find to find all of the images; in this case JPEG images.
find ${DIRECTORY} -type f \( -name "*.jpg" -o -name "*.JPG" \) |\
  while read FULL_IMAGE_PATH
  do
    # Get the image width with identify.
    IMG_W=$(identify -format %w ${FULL_IMAGE_PATH})

    # Calculate the X offset for the crop.
    X_OFFSET=$((($IMG_W-$CROP_W)/2))

    # Run the actual mogrify command.
    # mogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 ${FULL_IMAGE_PATH}
    echo mogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 ${FULL_IMAGE_PATH}

  done
1
JakeGould

JakeGouldは実用的な解決策を提供しましたが、はるかに簡単な解決策は、スクリプトを作成するのではなく、2段階の変換を使用することだと思います。まず、North重力で高さを250ピクセルに減らし、次にCenter重力で幅を250ピクセルに減らします。

mogrify -gravity North -crop x250+0+0  cat.jpg
mogrify -gravity Center -crop 250x250+0+0  cat.jpg

または、jpg以外の中間画像で変換を使用して、jpgへの余分な変換による品質の低下を防ぐこともできます。

convert -gravity North -crop x250+0+0 cat.jpg png:- | convert -gravity Center -crop 250x250+0+0 png:- cat.jpg
1
Wilbert