2016-05-27 4 views
0

Предположим, у меня есть исходное изображение (серый backgorund) с черным кругом немного вниз вправо (не по центру), а минимальное пространство от любого края круга до края - это, скажем, 75 пикселей. Я хотел бы обрезать одинаковое пространство со всех сторон, и пространство должно быть максимально возможным, без обрезки фактического объекта на изображении (область с пурпурным изображением). Хотелось бы услышать, как это можно решить.Как обрезать/обрезать изображение равномерно в 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. Наконец, сглаживание изображения даст желаемый результат.

Смежные вопросы