ImageMagick:裁剪但保持原始 canvas 大小并将背景涂成白色

ImageMagick: crop but keep original canvas size and paint background white

我想将图像裁剪成大小相同的图块,但不是通过将它们分开,而是通过生成子图像,其中只有裁剪区域保留原始图像,其余部分涂成白色。原始 canvas 大小保持不变。

通过阅读手册,here in specific,我认为我可以通过 运行:

轻松获得相同大小的图块
convert image.jpg -crop 7x6@ +repage +adjoin image_7x6_%d.jpg

然而,这给了我较小的图像。我在 imagemagick 板上发现 a post 建议将外部涂成白色是可行的,但我还没有弄清楚要使用哪个命令来实现它。

有人知道如何实现吗?

如果您拼贴图像并将拼贴保存为 PNG 文件,它们将 "remember" 它们在虚拟 canvas 上的原位置,因此您可以只需将它们放回相同尺寸的白色 canvas 即可。

convert -size 160x100 xc:red -crop 2x2@ frame-%d.png

现在查看图块,特别是第 4 列:

identify fra*.png
frame-0.png PNG 80x50 160x100+0+0 8-bit sRGB 2c 308B 0.000u 0:00.000
frame-1.png PNG 80x50 160x100+80+0 8-bit sRGB 2c 308B 0.000u 0:00.000
frame-2.png PNG 80x50 160x100+0+50 8-bit sRGB 2c 308B 0.000u 0:00.000
frame-3.png PNG 80x50 160x100+80+50 8-bit sRGB 2c 308B 0.000u 0:00.000

这里有一种方法可以实际为图像的其余部分涂上颜色。你要求白色,但出于显示目的,我将使用蓝色。

这里我使用了一些 Unix shell 脚本。

First, crop the image, but do not add +repage or that will remove the virtual canvas.

Save the images as MIFF (or PNG) to preserve the virtual canvas.

Then loop over each one as flatten against your color.

Then remove all the MIFF files.


输入:

convert lena.png -crop 2x2@ +adjoin lena_%02d.miff
for img in *.miff; do
name=$(convert $img -format %t info:)
convert $img -background blue -flatten $name.jpg
done
rm -f *.miff


您可以在 Windows 或 *nix 上使用 ImageMagick v6 或 v7 在单个命令中完成此操作,而无需使用这样的命令编写任何中间文件...

convert image.jpg -fill white \
   \( +clone -colorize 100 -write mpr:bg +delete \) \
   -crop 7x6@ -set geometry +%[fx:s.page.x]+%[fx:s.page.y] \
   mpr:bg null: +insert +insert -layers composite image_7x6_%d.jpg

这是使用 IM v6 的 *nix shell 语法。对于 Windows,将续行反斜杠“\”更改为脱字符“^”,并从括号“(...)”中删除反斜杠转义符“\(...\)”。

对于 IM v7,将 "convert" 更改为 "magick"。

编辑添加:正如弗雷德在下面的评论中指出的那样,裁剪的部分已经包含了它们在 canvas 上的原始位置的几何形状。该命令可以简化为更像这样的东西...

convert image.jpg \
   \( +clone -fill white -colorize 100 -write mpr:bg +delete \) \
   -crop 7x6@ mpr:bg null: +insert +insert -layers composite image_7x6_%d.jpg