如何使用网格分割图像并保留透明边界框
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
我有一些 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