imagemagick 将图像裁剪为特定的纵横比?

An *_*ser 9 imagemagick

给定图像,如何使用 imagemagick 将其调整为特定的纵横比?例如,纵横比为2:1

and*_*.46 13

需要考虑的两件事:

  1. 带有或不带有纵横比转换的简单调整大小
  2. 使用纵横比转换进行裁剪

我依次发言:

1.简单的调整大小有或没有纵横比转换

imagemagick默认情况下,将在转换期间保持图像预先存在的纵横比。使用此测试图像:

在此处输入图片说明

它方便地具有 100x100 的尺寸,尝试使用此语法调整到 300x150 将无声地失败

convert test.png -resize 300x150 300_test.png
Run Code Online (Sandbox Code Playgroud)

并将生成一个150x150 的图像:

在此处输入图片说明

要强制imagemagick实际生成 2:1 纵横比图像,需要以下略有不同的语法:

convert test.png -resize 300x150\! distort.png
Run Code Online (Sandbox Code Playgroud)

这实现了 2:1 的纵横比,当然原始图像会失真:

在此处输入图片说明

2. 纵横比转换裁剪

如果您更喜欢简单地自动将图像裁剪为指定的纵横比,最简单的方法是使用Fred 的 ImageMagick 脚本之一: 'Aspectcrop'。在我们的测试图像上的用法很简单:

./aspectcrop -a 2:1 test.png Fred_wins.png
Run Code Online (Sandbox Code Playgroud)

并且生成的图像已成功裁剪为 2:1 的比例:

在此处输入图片说明

要操作的另一个选项是-g gravity定义图像的哪一部分用于裁剪。默认为居中,所有选项为:

  1. 中心 (c)
  2. 北 (n)
  3. 南 (s)
  4. 东 (e)
  5. 西 (w)
  6. 西北 (nw)
  7. 东北 (ne)
  8. 西南, (sw)
  9. 东南 (se)

因此,举一个使用的例子:

./aspectcrop -a 2:1 -g n test.png north.png
Run Code Online (Sandbox Code Playgroud)

结果是:

在此处输入图片说明

如果您需要使用此脚本在单个目录中批量加载图像,您可以使用 bash 'for' 循环。首先正确放置脚本并将其设置为可执行:

sudo mv aspectcrop /usr/local/bin
sudo chmod +x /usr/local/bin/aspectcrop
Run Code Online (Sandbox Code Playgroud)

这使得使用脚本变得更加容易。然后从图像目录中运行“for”循环:

for i in *.png
do 
aspectcrop -a 2:1 -g n "$i" "${i%.png}_cropped.png"
done
Run Code Online (Sandbox Code Playgroud)

这个循环可以根据输入和输出文件的类型、不同的位置等而变化。您还可以生成类似的语法来递归搜索图像。很多可能性...

我认为这一切都很酷:)

参考: