将图像裁剪为精确的子图像

时间:2013-05-29 12:05:04

标签: html macos image-processing imagemagick

我知道使用ImageMagick,我们可以将图像裁剪为“子图像”(或图块)。

现在,假设我的图像宽度为480像素(高度可变)。

使用此命令,我可以成功裁剪它:

convert initial.png -crop 480x300 tiles.png

哪种结果导致各种tiles_0.pngtiles_1.png等 - 包含宽度为480像素的子图块。

然而,这里有一个问题:该命令返回所有480x300px图块(从上到下,因为它们可用),但也返回最后一个图块,非常明显地 - 它不能具有相同的高度(通常是小于300px)。


我怎么能改写命令,使它只输出给定的精确尺寸的瓷砖,而不是最后一个?

1 个答案:

答案 0 :(得分:0)

您可以使用ImageMagick的fx功能来计算在进行平铺之前砍掉底部所需的量。例如,mod运算符会告诉您将图像高度除以图块高度(300)时剩下的内容,如下所示:

# First create an arbitrary image 929 px high
convert -size 480x929 xc:blue initial.png

# Now see what we need to chop off
convert initial.png -format "%[fx:h%300]" info:
29

因此,我们需要使用此作为-chop的参数从底部删除29个像素,如果我们指定-gravity south,它将从底部删除。现在可以在一个命令中完成,如下所示:

convert initial.png                                           \
   -gravity south                                             \
   -chop 0x$(convert initial.png -format "%[fx:h%300]" info:) \
   -crop 480x300 +repage tile.png

这将为您提供3个瓷砖,每个300 px高:

identify tile*
tile-0.png PNG 480x300 480x300+0+0 8-bit sRGB 2c 286B 0.000u 0:00.000
tile-1.png[1] PNG 480x300 480x300+0+0 8-bit sRGB 2c 286B 0.000u 0:00.000
tile-2.png[2] PNG 480x300 480x300+0+0 8-bit sRGB 2c 286B 0.000u 0:00.000