如何使用网格分割图像并保留透明边界框

How to split an image with a grid and preserve transparency bounding box

我有一些 png 图像,我想将其分成多个部分,例如按网格或大小。

但每个部分都应具有与原始图像相同的边界框(透明度)。

示例:

将图像分成两部分。

原文: 200∼∼∼89

输出:


part_1.png, 200 × 89


part_2.png, 200 × 89

ImageMagick 可以做到吗?或任何其他应用程序或方法。

我的实际目标是拆分成 100 多个切片图像。


编辑:

另一个目标是每个切片有一个 缩进 。说 indent = 10px.

示例:

输入: 200 x 100


输出:


part_1.png, 200 x 100


part_2.png, 200 x 100

举个例子,直观地比较输入和输出:在 Photoshop 中将输出图像合并为一个层添加到另一个层上 200 x 100 :

这还显示了添加到组合中的输入图像(因此最好查看裁剪的内容和裁剪方式):

在 ImageMagick 中,您可以使用 -crop 命令将图像分割成许多部分。对于上面包含两部分的示例,您可以使用以下命令执行此操作。 ImageMagick 会将 -0、-1 ... 附加到输出文件名。

ImageMagick 6:

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 50x100% \) -layers composite result.png


ImageMagick 7:

magick \( image.png -set option:dim "%wx%h" -crop 50x100% \) null: \( -size "%[dim]" xc:none \) -reverse -layers composite result.png


结果是:

http://www.imagemagick.org/Usage/crop/#crop http://www.imagemagick.org/Usage/crop/#crop_percent http://www.imagemagick.org/Usage/crop/#crop_tile http://www.imagemagick.org/Usage/crop/#crop_quad http://www.imagemagick.org/Usage/crop/#crop_equal

http://www.imagemagick.org/script/command-line-options.php#layers

请注意,如果您之后不添加 +repage,-crop 会保留虚拟 canvas 信息。因此,要将单个图像放回其原始位置,您必须将它们合成到输入大小的透明背景上。这是在使用 null: 分隔符的 -layers composite 的一个命令中完成的。

要回答您的新问题,您可以使用脚本循环来完成。在类 Unix 平台上,假设您的图像没有空格,您可以执行以下操作:

cd path/to/current_folder
list=`ls *.png`
for img in $list; do
name=`convert $img -format "%t" info:`
dim=`convert $img -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( $img -crop 50x100% \) -layers composite -scene 1 path/to/new_folder/${name}_%d.png
done


如果你想在输出中前导 0,比如 3,使用 path/to/new_folder/${name}_%03d.png.

请注意,为了从 1 而不是 0 开始,我添加了 -scene 1。

抱歉,我不知道如何为 Windows 编写脚本。

请始终提供您的 ImageMagick 版本和平台。

在 ImageMagick 中,将透明区域放入图像的最佳方法是使用放入图像的 alpha 通道的二进制蒙版。

convert input.png \( -size 200x89 xc:white -size 10x89 xc:black -gravity center -composite \) -alpha off -compose copy_opacity -composite result.png


您可以添加任意数量的空白区域,方法是向蒙版添加更多白色区域,或者平铺出一个黑色区域和一个白色区域,以创建具有规则黑白间距的蒙版。

编辑以添加此 ImageMagick 6 示例,它将输入图像分成 4 块,原始宽度的 25% 和高度的 100%,然后为每块创建一个透明的 canvas,尺寸相同输入图像,并将片段定位在 canvases.

上的原始偏移处
convert input.png -set option:distort:viewport %[w]x%[h] -crop 25x100% \
   -virtual-pixel none -distort affine "0,0 %[fx:s.page.x],%[fx:s.page.y]" out%03d.png

输出文件名将从零开始编号,如"out000.png"等

原始消息...

这是一个使用 ImageMagick 7 的简单命令,它可以将图像裁剪成任意数量的片段,并在原始输入尺寸的透明背景上以原始偏移量输出所有片段...

magick input.png -crop 100x1@ -background none \
   -extent "%[fx:s.page.width]x%[fx:s.page.height]-%[fx:s.page.x]-%[fx:s.page.y]" out%03d.png

“-crop 100x1@”告诉它将图像分割成 100 块宽 x 1 块高的网格。您也可以将裁剪大小指定为百分比或像素数。

再次编辑添加:

以下命令会将输入图像拆分为使用“-crop”运算符指定的各个部分,然后从每个部分的每一侧剃掉 5 个像素,然后在每个部分的每一侧应用一个 5 像素的透明边框.它仍然会记住输入 canvas 中片段的原始位置,因此“-扭曲仿射 ...”可以扩展 canvases 并将片段放置在输入图像中的位置。

convert input.png -set option:distort:viewport %[w]x%[h] \
   -bordercolor none -background none -virtual-pixel none \
   -crop 25x100% -shave 5x5 -border 5x5 \
   -distort affine "0,0 %[fx:s.page.x],%[fx:s.page.y]" out%03d.png

要在 IM7 上使用此命令,您需要将 "convert" 更改为 "magick"。

这是在 ImageMagick 中的裁剪部分之间添加透明区域的另一种方法。将图像裁剪成几块,切掉要删除的部分,然后通过管道传输到蒙太奇以重新添加间距。

输入:

这里我将其制作成 4x4 的图像网格,间距为 10 像素:

convert lena.png -crop 25%x25% +repage -gravity east -chop 10x0 -gravity south -chop 0x10 +repage miff:- | montage - -background none -tile 4x4 -geometry +5+5 result.png

考虑到 Kamikaze 提供的要求的变化,这里是一种在 ImageMagick 中实现缩进分割的方法,假设我理解正确。

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 50x100% -shave 5x5 \) -geometry +5+5 -layers composite result.png

为了检查,我在蓝色背景上展平:

convert result-0.png result-1.png -background blue -flatten result.png