2016-05-27 182 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設置頁面幾何(正確的寬度&高度和新的偏移量)。最後,展平圖像將產生所需的輸出。