обрезать изображение со смещением imagemagick в процентах - PullRequest
1 голос
/ 08 октября 2019

Команда обрезки imagemagick поддерживает обрезку до процента изображения , но значения смещения должны быть указаны в значениях пикселей, например:

convert image.png -crop 50%x+10+20

Я хочу обрезать значения смещения x и y приведены в процентах от ширины изображения и высоты соответственно. Значения пикселей можно рассчитать, например, если размер изображения равен 100x200, смещение в 10% приведет к 10 и 20 соответственно. Можно ли сделать этот расчет как часть звонка на convert? Ширина и высота доступны как %w и %h в некоторых местах, но это не работает:

convert image.png -crop 50%x+(0.1*%w)+(0.1*%h)

Ответы [ 3 ]

3 голосов
/ 09 октября 2019

Если вы используете IM v6, вы можете использовать FX-выражения с «-set» для установки атрибутов изображения. Установив геометрию страницы, вы можете указать смещения для вычисленного процента и выполнить обрезку следующим образом ...

convert image.png -set page -%[fx:w*0.1]-%[fx:h*0.1] -crop 50%x+0+0 result.png

При считывании изображения устанавливается геометрия для верхнего левого угла в положение внеисходный холст и обрезка до нового верхнего левого угла, заданного геометрией.

Обратите внимание, что смещения являются отрицательными числами.

Кроме того, если вы выполняете дополнительную обработку в той же команде, которую вы 'Возможно, вы захотите «+ repage» после обрезки, чтобы сбросить геометрию страницы до нового WxH + 0 + 0.

Отредактировано, чтобы добавить: Вы можете даже включать размеры ширины и высоты для обрезки, когдаиспользуя "-set page". Эта команда обрезает вывод на 50% ширины и высоты ввода, начиная с 10% слева и сверху ...

convert image.png \
   -set page %[fx:w*0.5]x%[fx:h*0.5]-%[fx:w*0.1]-%[fx:h*0.1] -crop +0+0 result.png

Обратите внимание, что операция обрезания просто "-crop +0+0 ", поскольку размеры и смещения находятся в геометрии страницы.

Этот метод позволяет использовать более сложные вычисления, чем просто использование процента или количества пикселей для обрезанных выходных измерений.

2 голосов
/ 08 октября 2019

Вы не можете сделать это в ImageMagick 6. Но вы можете сделать это в ImageMagick 7.

magick image.png -crop "50%x+%[fx:0.1*w]+%[fx:0.1*h]" +repage result.png


В ImageMagick 6 вам нужно выполнять вычисления перед командой, сохранять их впеременной и используйте переменную в команде обрезки.

Однако в ImageMagick 6 вы можете сделать эквивалент, используя -distort с обработкой области просмотра следующим образом:

convert image.png -set option:distort:viewport "%[fx:0.5*w]x%[fx:0.5*h]+%[fx:0.1*w]+%[fx:0.1*h]" -filter point -distort SRT 0 result.png


1 голос
/ 08 октября 2019

С v7 ImageMagick , создайте начальное изображение:

magick -size 200x100 gradient: a.jpg

Теперь обрезайте, используя множество рассчитанных значений ширины, высоты, смещения:

magick a.jpg -crop "%[fx:w*0.9]x%[fx:h*0.8]+%[fx:w*0.1]+%[fx:h*0.05]" b.png

Проверьте:

identify b.png
b.png PNG 180x80 200x100+20+5 8-bit Gray 256c 408B 0.000u 0:00.000

Если у вас есть только v6, используйте bash и целочисленную арифметику:

read w h < <(identify -format "%w %h" a.jpg)
convert a.jpg -crop $((w*80/100))x$((h*90/100))+$((w*10/100))+$((h*5/100))  result.png

Проверьте:

identify result.png
result.png PNG 160x90 200x100+20+5 8-bit Gray 256c 412B 0.000u 0:00.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...