答案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