У меня есть большое количество файлов с изображением монеты на черном войлочном фоне. Используя 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