2016-05-27 184 views
0

假设我有一个原始图像(灰色backgorund),黑色圆圈向右下方(不居中),并且从圆形的任何边缘到边缘的最小空间可以说是75px。我想修剪所有边上的相同数量的空间,并且该空间应该是可能的最大空间,而不会裁剪图像中的实际对象(图像中洋红色的区域)。很想听听如何解决这个问题。如何在ImageMagick中统一裁剪/裁剪图像?

Not centered object

提前感谢!

回答

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

干得好!你是否需要'-canny 1x1' - 我认为它没有改变。 –

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设置页面几何(正确的宽度&高度和新的偏移量)。最后,展平图像将产生所需的输出。