Как выполнить автоматическую обрезку с помощью Imagemagick, сохранив небольшую рамку?

Как выполнить автоматическую обрезку с помощью Imagemagick, сохранив небольшую рамку?

У меня есть большое количество файлов с изображением монеты на черном войлочном фоне. Используя ImageMagick, я могу довольно просто автоматически обрезать эти изображения, используя -trim и -fuzz.

Обнаружение края работает хорошо, я хотел бы найти параметр, который позволил бы мне сказать "найти край, но затем вернуться на 10 пикселей", то есть сохранить периметр в 10 пикселей вокруг монеты вместо обрезки прямо по нему. Я не хочу добавлять новую границу, как с командой -splice, а вместо этого сохранить этот интервал из исходного изображения.

Пока я не нашел способа сделать это, самое близкое, что я придумал, — запустить его в режиме -trim info:-, захватить вывод и пересчитать обрезку, используя ручную обрезку, но я бы предпочел одношаговый процесс.

Я использую ImageMagick под Windows 10, и хотя я установил расширения bash, я не тестировал никаких скриптов под ним, поэтому решение, использующее исключительно командную строку Imagemagick, было бы предпочтительнее.

решение1

Из-за отсутствия элегантного решения я выбрал работающее и написал грубый скрипт bash, который, кажется, отлично справляется с задачей. Он оставляет смещение в 25 пикселей вокруг монеты, используя исходную графику для предоставления фона. Я в конечном итоге параметризую это и подчищу это, но это рабочий скрипт на сегодняшний день.

for f in *.jpg; do
    trimbox=$(convert $f -fuzz 25% -format "%@" info:)
    orig=$trimbox
    first=${trimbox%x*}
    trimbox=${trimbox#*x}
    second=${trimbox%%+*}
    trimbox=${trimbox#*+}
    third=${trimbox%+*}
    fourth=${trimbox#*+}
    #echo "trimbox: $orig first: $first second: $second third: $third fourth:$fourth"
    ((first+=50))
    ((second+=50))
    ((third-=25))
    ((fourth-=25))
    trimbox=$first"x"$second"+"$third"+"$fourth
    convert "$f" -crop "$trimbox" +repage "trimmed-$f"
done

решение2

Для этого можно использовать -borderи -bordercolor— например, для прозрачной границы вам может понадобиться:

for f in *.jpg; do
  convert -fuzz 25% -trim -border 25 -bordercolor none +repage $f trimmed-$f
done

Видетьhttp://www.imagemagick.org/Usage/crop/#border

Связанный контент