ImageMagick, установить относительный размер в цепочке операторов преобразования - PullRequest
2 голосов
/ 21 марта 2020

Мне нужно установить размер относительно уже установленного размера. Мне это нужно, потому что мой поток включает определение примитивов внутри других. Например,

convert -size 200x100 xc:black \( -size 30x40% xc:red \) -gravity West -composite out.png

То, что 30x40% не работает таким образом, становится пикселями 30x40. Я могу достичь этой заданной цели c в первом примере, используя resize

convert -size 200x100 xc:black \( xc:red -resize 30x40% \) -gravity West -composite out.png

Во второй версии x c: red наследует размер 200x100, поэтому -resize работает, как и ожидалось. Хотя размер дальнейших / внутренних примитивов не уменьшается до 60x40, он остается 200x100, поэтому в третьем примере зеленый прямоугольник имеет ориентационный ландшафт, а не портретный

convert -size 200x150 xc:blue \
  \( xc:red -resize 50x100% \
    \( xc:green -resize 40% \) \
    -gravity Center \
    -composite \
  \) \
  -gravity West \
  -composite \
  out.png

Таким образом, зеленая область составляет 80x60 пикселей, 40 % от 200х150. Я хотел бы как-то сбросить размер до размера x c: красный после изменения размера к тому времени, когда я представляю x c: зеленый.

1 Ответ

2 голосов
/ 21 марта 2020

Я думаю, что вы пытаетесь создать холсты, в которых каждый будет в процентах от размера предыдущего. Возможно, есть более простой способ, но вы можете сохранить каждый холст (и неявно его размер) в MPR «Magick Persistent Register» (именованный кусок оперативной памяти) при его создании, а затем вызвать последний и перезаписывайте его каждый раз, когда вы хотите что-то сделать относительно этого:

convert -gravity west -size 200x100 xc:black -write MPR:S                      \
   \( MPR:S -resize 30x40% -fill red  -colorize 100 -write MPR:S \) -composite \
   \( MPR:S -resize 50x50% -fill blue -colorize 100 -write MPR:S \) -composite \
   \( MPR:S -resize 50x50% -fill lime -colorize 100 \) -composite  result.png

enter image description here


В качестве альтернативы, вы можете позволить вашему bash / Оболочка POSIX делает это для вас внутри "арифметического c выражения" :

W=200
H=100
convert -gravity west -size ${W}x${H} xc:black                    \
   \( -size $((W=W*30/100))x$((H=H*40/100)) xc:red  \) -composite \
   \( -size $((W=W*50/100))x$((H=H*50/100)) xc:blue \) -composite \
   result.png

enter image description here

Имейте в виду, что Оболочка имеет дело только с целочисленной математикой, поэтому она не закончится хорошо, если вы нацелены на 50% из 25 пикселей ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...