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

Ste*_*ies 6 imagemagick images mogrify

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

预期的

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

得到了

请注意,我将批量处理大约 10,000 张不同大小的图像,因此我无法明确选择要裁剪的确切区域。

小智 5

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

mogrify -gravity North -crop x250+0+0  cat.jpg
mogrify -gravity Center -crop 250x250+0+0  cat.jpg
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 Convert 与非 jpg 中间图像,以防止由于额外转换为 jpg 而导致质量损失:

convert -gravity North -crop x250+0+0 cat.jpg png:- | convert -gravity Center -crop 250x250+0+0 png:- cat.jpg
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是比复杂脚本更好的答案/解决方案。 (2认同)

Gia*_*968 3

在我的脑海中,从数学上讲,您应该处理从左上角开始的坐标0,0(又名:NorthWest在 ImageMagick 术语中),因此您需要将裁剪框区域定位为如下所示:

\n\n
(width of image - width of crop area) / 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,您可以使用示例命令从概念上执行类似的操作mogrify

\n\n
mogrify -crop 250x250+[(width of image - 250)/2]+0 -gravity NorthWest cat.jpg\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个相当不错的概念,但并不是一个有用的现实。但我只是进行了一些实验,并使其适用于单个测试图像:

\n\n
CROP_W=250\nCROP_H=250\nIMG_W=$(identify -format %w test.jpg)\nX_OFFSET=$((($IMG_W-$CROP_W)/2))\nmogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 -gravity NorthWest test.jpg\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于 ImageMagick\xe2\x80\x99s-gravity默认值NorthWest无论如何,您可以通过-gravity完全删除该选项来简化它,如下所示:

\n\n
CROP_W=250\nCROP_H=250\nIMG_W=$(identify -format %w test.jpg)\nX_OFFSET=$((($IMG_W-$CROP_W)/2))\nmogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 test.jpg\n
Run Code Online (Sandbox Code Playgroud)\n\n

在测试了这个概念之后,我编写了这个 Bash 脚本,它按预期工作。只需更改该DIRECTORY值以匹配您计划执行操作的实际目录即可。这echo mogrify使您可以准确地看到如果运行该命令会发生什么;echo如果您对结果感到满意,请将其删除,然后让脚本继续执行:

\n\n
#!/bin/bash\n\n# Set the crop width and height.\nCROP_W=250\nCROP_H=250\n\n# Set the directory to act on.\nDIRECTORY=\'/path/to/images\'\n\n# Use find to find all of the images; in this case JPEG images.\nfind ${DIRECTORY} -type f \\( -name "*.jpg" -o -name "*.JPG" \\) |\\\n  while read FULL_IMAGE_PATH\n  do\n    # Get the image width with identify.\n    IMG_W=$(identify -format %w ${FULL_IMAGE_PATH})\n\n    # Calculate the X offset for the crop.\n    X_OFFSET=$((($IMG_W-$CROP_W)/2))\n\n    # Run the actual mogrify command.\n    # mogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 ${FULL_IMAGE_PATH}\n    echo mogrify -crop ${CROP_W}x${CROP_H}+${X_OFFSET}+0 ${FULL_IMAGE_PATH}\n\n  done\n
Run Code Online (Sandbox Code Playgroud)\n