ImageMagick,在转换运算符链中设置相对大小

ImageMagick, set relative size in chain of convert operators

我需要根据已设置的大小设置大小。我需要它,因为我的流程涉及在其他原语中定义原语。例如

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

30x40% 不是这样工作的,它变成了 30x40 像素。我可以通过使用 resize

在第一个示例中实现这个特定目标
convert -size 200x100 xc:black \( xc:red -resize 30x40% \) -gravity West -composite out.png

在第二个版本中,xc:red 继承了 200x100 的大小,因此 -resize 可以按预期工作。虽然 further/inner 图元的大小没有减少到 60x40,它仍然是 200x100,所以在第三个例子中,绿色矩形的方向是横向而不是纵向

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

因此绿色区域为 80x60 像素,占 200x150 的 40%。在我介绍 xc:green.

调整大小后,我想以某种方式将大小重置为 xc:red 的大小

我认为您正在尝试创建 canvases,其中每个都是前一个大小的百分比。可能有一种更简单的方法,但是您可以在创建时将每个 canvas (及其大小)保存在 MPR "Magick Persistent Register" (命名为 RAM 块)中它,然后调用最新的并在每次你想做与它相关的事情时覆盖它:

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


或者,您可以让 bash/POSIX shell 在 "arithmetic expression" 中为您完成:

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

请注意 shell 仅处理整数数学,因此如果您的目标是 25 像素的 50%,它不会有好的结果...