ImageMagick:从图像中获取最大的正方形

swa*_*ner 5 imagemagick

我确实有数千张不同大小的图像;现在我想在没有透明/黑色背景的情况下获得最大的正方形。当然,比例应该保持,如果它是一个风景图像,所有的高度都应该在目标图像中,但左右应该被裁剪;对于肖像图像,反之亦然。

这怎么可能?

Mar*_*ell 10

我想你是这个意思。如果您从横向图像开始bean.jpg

在此处输入图片说明

magick bean.jpg -gravity center -extent "%[fx:h<w?h:w]x%[fx:h<w?h:w]" result.jpg
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您从肖像图像开始,则scooby.jpg

在此处输入图片说明

magick scooby.jpg -gravity center -extent "%[fx:h<w?h:w]x%[fx:h<w?h:w]" result2.jpg
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


双引号里面的部分是有趣的部分。它基本上是设置图像的范围,例如:

-extent 100x100
Run Code Online (Sandbox Code Playgroud)

其中 100 是宽度和高度。不过,我使用的是计算表达式,该表达式使用三元运算符测试高度 ( h) 是否小于宽度 ( w)。这导致将当前高度和宽度中较小的部分作为新的高度和宽度,因此那里确实有两个计算表达式,x它们之间有一个,类似于100x100.


请注意,此方法需要ImageMagick v7 或更高版本 - 即它使用magick命令而不是 v6 的convert命令。如果您有 v6,则需要使用更多步骤。首先,获取图像的宽度和高度,然后选择两者中较小的一个,然后发出一个convert设置了重力和范围的命令。在bash

# Get width and height
read w h < <(identify -format "%w %h" scooby.jpg)

# Check them
echo $w,$h
272,391

# Set `n` to lesser of width and height
n=$w
[ $h -lt $n ] && n=$h

# Now do actual crop
convert scooby.jpg -gravity center -extent "${n}x${n}" result.jpg
Run Code Online (Sandbox Code Playgroud)

如果您有成千上万的事情要做,如果您使用的是macOSLinux,我建议您使用GNU Parallel。如果您使用的是 Windows,抱歉,您将需要一个循环并且无法轻松使用所有 CPU 内核。

我还没有测试过以下内容,因此只能在几个文件的小型复制样本上进行尝试:

# Create output directory
mkdir output

# Crop all JPEG files, in parallel, storing result in output directory
parallel --dry-run magick {} -gravity center -extent "%[fx:h<w?h:w]x%[fx:h<w?h:w]" output/{} ::: *.jpg
Run Code Online (Sandbox Code Playgroud)

如果命令看起来不错,请删除该--dry-run部分以真正执行此操作。


小智 8

我发现这样更容易记住:

convert in.png -gravity Center -extent 1:1 out.png
Run Code Online (Sandbox Code Playgroud)