如何在ImageMagick中均匀剪裁/裁剪图像?

时间:2016-05-27 11:48:01

标签: image image-processing imagemagick

假设我有一个原始图像(灰色backgorund),黑色圆圈向右下方(未居中),从圆圈的任何边缘到边缘的最小空间,例如,75px。我想在所有侧面修剪相同的空间,并且空间应该是可能的最大空间而不裁剪图像中的实际对象(图像中的品红色区域)。很想知道如何解决这个问题。

Not centered object

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,您希望根据minimum bounding rectangle裁剪图像而不是,而外部边界矩形。

我会做这样的事情......

鉴于我用。创建图像。

convert -size 200x200 xc:gray75 -fill black -draw 'circle 125 125 150 125' base.png

base image

我会将图像放到二进制边缘&将所有内容修剪到最小边界矩形。

convert base.png -canny 1x1 -trim mbr.png

find mbr

这将生成mbr.png图像,该图像也将包含原始页面信息。可以使用identify实用程序提取页面信息,以计算外部边界矩形。

sX=$(identify -format '%W-(0 %X)-%w\n' mbr.png | bc)
sY=$(identify -format '%H-(0 %Y)-%h\n' mbr.png | bc)

最后将带有-shave的计算结果应用于原始图像。

convert base.png -shave "${sX}x${sY}" out.png

uniform crop

答案 1 :(得分:1)

我假设您想要通过最小的水平或垂直距边缘来修剪图像(或在ImageMagick术语中修剪)。如果是这样,可以用这一个衬垫来完成:

convert circle.png -trim -set page "%[fx:page.width-min(page.width-page.x-w,page.height-page.y-h)*2]x%[fx:page.height-min(page.width-page.x-w,page.height-page.y-h)*2]+%[fx:page.x-min(page.width-page.x-w,page.height-page.y-h)]+%[fx:page.y-min(page.width-page.x-w,page.height-page.y-h)]" -background none -flatten output.png  

这可能看起来很复杂但实际上并非如此。首先修剪图像。结果仍将存储有关页面几何的信息,包括原始宽度,高度和实际偏移。通过此信息,我可以使用ImageMagick FX expressions设置页面几何(正确的宽度和高度以及新的偏移)。最后,展平图像将产生所需的输出。