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

时间:2017-10-03 08:00:12

标签: imagemagick

我确实有数以千计的不同尺寸的图像;现在我想在没有透明/黑色背景的情况下获得最大的广场。当然,这个比例应该保留,如果它是,例如一个风景图像所有高度应该在目标图像中,但应该裁剪左右;对于肖像图像,反之亦然。

怎么可能?

2 个答案:

答案 0 :(得分:4)

我认为你的意思是这个。如果您从横向图片bean.jpg开始:

enter image description here

magick bean.jpg -gravity center -extent "%[fx:h<w?h:w]x%[fx:h<w?h:w]" result.jpg

enter image description here

如果您以肖像图像开头,scooby.jpg

enter image description here

magick scooby.jpg -gravity center -extent "%[fx:h<w?h:w]x%[fx:h<w?h:w]" result2.jpg

enter image description here

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

-extent 100x100

其中100是宽度和高度。而不是那样,我使用一个计算表达式,使用三元运算符测试高度(h)是否小于宽度(w)。这导致当前高度和宽度的任何小于新的高度和宽度,因此在那里有两个计算的表达式,它们之间有x,类似于100x100。< / p>

请注意,此方法需要 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

如果您有数千个要做,如果您使用 macOS Linux ,我建议您使用 GNU Parallel 。如果您使用的是Windows,抱歉,您需要一个循环,并且无法轻松使用所有CPU内核。

我没有对以下内容进行过测试,因此只能在一些小文件的COPIED上进行试用:

# 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

如果命令看起来不错,请删除--dry-run部分以进行实际操作。

答案 1 :(得分:1)

如果你正在使用ImageMagick v7,Mark Setchell提供了一个上面(或下面)的简单方法。如果您使用的是IMv6,则可以使用命令从任何图像中裁剪出最大的中心方块...

convert input.png -set option:distort:viewport "%[fx:min(w,h)]x%[fx:min(w,h)]" \
    -distort affine "%[fx:w>h?(w-h)/2:0],%[fx:w<h?(h-w)/2:0] 0,0" output.png

将输出视口大小设置为您可以从输入图像裁剪的最大方块。然后它调整输入图像的位置,使其在该方形视口中居中。

此命令应在大多数* nix系统上的命令提示符或脚本中运行。如果您使用的是Windows,请使用插入符“^”替换该连续行反斜杠“\”。如果您在Windows中使用BAT脚本,则还必须将所有单个百分号“%”设置为双倍“%%”。

您也可以简单地将“convert”更改为“magick”以使用IMv7运行此命令。

相关问题