【问题标题】:How to split an image with a grid and preserve transparency bounding box如何用网格分割图像并保留透明度边界框
【发布时间】:2018-11-21 01:02:26
【问题描述】:

我有一些 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:

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

【问题讨论】:

    标签: image-processing imagemagick bounding-box


    【解决方案1】:

    鉴于 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
    

    【讨论】:

      【解决方案2】:

      编辑添加了这个 ImageMagick 6 示例,它将输入图像分成 4 块,原始宽度的 25% 和其高度的 100%,然后为每个块创建一个与输入图像相同尺寸的透明画布,并定位这些画布上的原始偏移量。

      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 像素的透明边框。它仍然会记住输入画布中碎片的原始位置,因此“-distort affine ...”可以扩展画布并将碎片放置在输入图像中的位置。

      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”。

      【讨论】:

      • 谢谢。我可以添加一个插入,就像在前面的问题 cmets 中一样,就像 i.stack.imgur.com/1y8gi.png 但分开的图像。
      • 如果我理解您的问题,您应该可以在裁剪后立即添加“-shave NxN -border NxN”,其中 N 是您想要的图像块周围空间的宽度。确保在剃须和边框操作之前设置“-bordercolor none -background none”,以便碎片周围的空间是透明的。
      • 你能分享所有这些完整的命令吗?我昨天刚刚安装了ImageMagick,所以我只是在学习它。如果可能的话,你能否也编辑你的答案。谢谢。
      • 非常感谢。这就是我需要的!
      【解决方案3】:

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

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


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

      【讨论】:

      • 那是我的错,我描述的不是很清楚。所以,我应该补充一点:在任何情况下(只是裁剪,或用插图裁剪)输出我都希望有多个图像,所以 result-0.png、result-1.png 等等。我展示了在 Photoshop 中组合这些图像的示例,只是为了表明最终它与原始图像相比具有插图。换句话说 - 只需从您的第一个答案中进行简单裁剪,如果您将输出组合到 1 个图像中,您将获得与 input.png 完全相同的外观。但是如果使用了insets,你会得到和你展示的一样的——lena.png。但无论如何,它是多个图像和相同大小。
      【解决方案4】:

      这是在 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
      

      【讨论】:

      • 当我运行它时,我得到:Fontconfig warning: ignoring UTF-8: not a valid region tag 但无论如何我有result.png 文件。 Input image usedresult image。所以问题是:1)就像从左上角开始裁剪。 2)它是输出的一张图片,请检查我的 cmets 从其他你的答案。总的来说,这看起来几乎是我所需要的。
      • 我已经编辑了问题,我希望我现在很清楚,对不起我的英语,这是我认为的主要问题..
      【解决方案5】:

      要回答您的新问题,您可以使用脚本循环来回答。在类 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 版本和平台。

      【讨论】:

      • 我在 macOS 上。今天刚安装ImageMagickimagemagick.org/script/download.php#macosx 所以应该是最新的(但是我使用了第一个脚本,因为-bash: magick: command not found 第二个错误。)。那么我需要创建一个 sh 文件来运行它吗?
      • 您的 ImageMagick 版本是多少?尝试convert -versionmagick -version。 convert 用于 IM 6,magick 用于 IM 7。如果要复制并粘贴到终端窗口,则无需添加 bash。如果另存为脚本,则必须在脚本名称前添加 bash。
      • Version: ImageMagick 6.9.9-40 Q16
      • Magick 是 IM 7 的,你使用的是 IM 6,所以你需要使用命令的转换格式。
      【解决方案6】:

      在 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 会保留虚拟画布信息。因此,要将单个图像放回其原始位置,您必须将它们合成到与输入大小相同的透明背景上。这是在一个命令中使用 -layers 复合使用 null: 分隔符完成的。

      【讨论】:

      • 谢谢!效果很好。还有一件事:是否可以改进命令以执行以下操作:在目录中查找所有.png 文件并像当前一样对其进行裁剪,但输入名称为:image_1.png 和输出文件名将是 image_1_1.png、image_1_2.png ..等等。
      • 还有一件事:) - 我可以在输出图像中使用缩进吗?从四面八方来看,所以如果indent = 10 图像最终应该是这样的:i.piccy.info/i9/e8c296de097d5fbd155030ba52120b70/1528748434/318/… - 请注意-10 像素从每一侧切割。
      • 我不确定你想要什么缩进?你能进一步解释一下吗?裁剪命令允许偏移,但是你不能分割成多个部分。请绘制一张图,显示您想要如何缩进或偏移。是针对一种作物还是针对所有作物?
      • 我可以说每个图像都将被修剪,如下所示:i.piccy.info/i9/b8533c21cf6761d2432042cf63931997/1528749085/…,因此它看起来像这样:i.piccy.info/i9/e8c296de097d5fbd155030ba52120b70/1528748434/318/…,但 png 大小将保持不变。那就是我打电话给indent。如果不清楚,我可以提供更详细的示例。
      • 另一个例子:如果this imageinput.png,那么全部填充为红色,我将其裁剪为2 部分和indent = 10px,然后我只是将这些部分添加为图层Photoshop 一个接一个我will get this 所以,可能它适用于所有作物。
      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多