如何在 ImageMagick 中使用 morgify 裁剪北部和中心

如何在 ImageMagick 中使用 morgify 裁剪北部和中心

有没有办法裁剪水平居中但不垂直居中的图像?例如,以下是我想要裁剪的图像:

预期的

但是,使用命令mogrify -crop 250x250 -gravity North cat.jpg,我得到:

得到

笔记我将对大约 10,000 张不同大小的图像进行批量处理,因此我无法明确选择要裁剪的精确区域。

答案1

从我的脑子里首先想到的是,从数学上来说,你应该处理从左上角开始的坐标0,0(又名:NorthWest用 ImageMagick 术语来说),因此你需要将裁剪框区域定位成如下所示的样子:

(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

答案2

Giacomo1968 给出了一个可行的解决方案,但我认为更简单的解决方案不是编写脚本,而是使用两步转换。首先使用重力,然后使用中心重力:

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

相关内容