如何使用虚拟 canvas(trim 结果)进行裁剪?

How to crop using a virtual canvas (trim result)?

trim使用 ImageMagick 编辑了一张图片:

step2.png[0] PNG 1200x1200=>264x468 1200x1200+381+273 8-bit sRGB 0.031u 0:00.014
step3.png[0] PNG 264x468 1200x1200+381+273 8-bit sRGB 31.8KB 0.000u 0:00.000

现在,我想使用 trim 找到的区域(从 381,273 开始的 264x468 像素区域)裁剪另一张图像(step2.png 的前身)。我如何以编程方式执行此操作,即不从 -identify 输出中复制粘贴 381,273 等?

我的想法是制作 step3.png 的 alpha 蒙版并将其与原始图像合成,但我不知道该怎么做。

更新答案

经过深思熟虑,我想你可能是这个意思,其中 other.png 得到 trimmed 以匹配 trimmed_orig.png:

composite -compose src other.png trimmed_orig.png trimmed_other.png

图片是这样的:

identify other.png trimmed_orig.png trimmed_other.png

other.png PNG 560x360 560x360+0+0 8-bit sRGB 2c 312B 0.000u 0:00.000
trimmed_orig.png PNG 400x200 560x360+80+80 8-bit sRGB 2c 340B 0.000u 0:00.000
trimmed_other.png PNG 400x200 560x360+80+80 8-bit sRGB 2c 340B 0.000u 0:00.000

原答案

不确定您的意思是以下还是明确不是以下,但让我们试试看。

假设您从这张图片开始:

并且您想 trim 离开红色,并找到内部蓝色区域的位置。你可以这样做:

convert image.png -trim trimmed.png

你会得到一个蓝色的 400x200 图像,从左上角偏移 80,80。与其这样做,不如让 ImageMagick 告诉你它会 trim 不这样做,使用 -format %@ 像这样:

convert image.png -format "%@" info:
400x200+80+80

因此,您将像这样捕获它:

trim=$(convert image.png -format"%@" info:)

现在,如果您有另一张这样的图片:

您可以 trim 它使用与您想要从原始图像 trim 相同的区域,如下所示:

convert other.png -crop $trim cropped.png

使用 ImageMagick 7+,您可以通过存储一个图像的大小并将其用作另一个图像的 trim 大小来使用 fx 表达式非常容易地做到这一点:

magick \( \
    step3.png -set option:trimzone "%[fx:w]x%[fx:h]+%[fx:page.x]+%[fx:page.y]" +delete \
    \) other_image.png -crop %[trimzone] output.png

老实说,您也可以消除大部分或全部中间 "step x" 文件,但如果没有关于您的过程的更多细节,很难说如何。