ImageMagick:用单个图块替换所有图像图块

ImageMagick: Replace All Image Tiles with Single Tile

我假设 ImageMagick 是最好的选择,但如果您有其他可以编写脚本的建议,请告诉我。

我正在尝试用单个图块替换图像的所有 32x32 图块。这是原始图像的示例:

这是我要用来替换原始图像上所有图块的图块:

这就是我想要的输出:

我从 Stack Overflow 上的其他帖子了解到,我可以使用 ImageMagick 的 composite 选项将图块叠加到原始图像上:

$ convert original.png tile.png -composite overlay.png

结果如下:

而且我假设通过了解原始图像尺寸我可以多次手动覆盖图块。但是有没有办法使这个过程自动化。在我给出的示例图片中,我需要在原始 64x128 图像上叠加 8 次图块。

如何使用 ImageMagick 或其他软件执行此操作?如果使用 ImageMagick,montagecomposite 命令会是更好的选择吗?

编辑:作为附加问题,是否可以跳过完全透明的图块?

输入示例:

输出示例:

能够完成这部分并不重要,但会很好。

我不知道你为什么需要在原件上叠加 8 个瓷砖。只需从头开始创建它并将输出命名为与原始名称相同

您可以使用 Imagemagick 蒙太奇来做到这一点(unix 语法):

nx=`convert original.png -format "%[fx:w/32]" info:`
ny=`convert original.png -format "%[fx:h/32]" info:`
num=$((nx*ny-1))
montage tile.png -duplicate $num -tile ${nx}x${ny} -geometry +0+0 result.png


这里我使用convert来复制tile,但是它使用了一个相对当前的-duplicate特性。如果您没有足够当前版本的 Imagemagick,则只需按如下方式重复蒙太奇拼贴:

montage Ro1Lp.png Ro1Lp.png Ro1Lp.png Ro1Lp.png Ro1Lp.png Ro1Lp.png Ro1Lp.png Ro1Lp.png -tile 2x8 -geometry +0+0 result.png


如果平铺图像均匀地适合原始尺寸,像这样的命令应该可以完成您想要的大部分...

convert original.png tile.png -background none -virtual-pixel tile \
   -set option:distort:viewport %[fx:u.w]x%[fx:u.h] -distort SRT 0 +swap \
   -compose copyopacity -composite overlay.png

两张图片都读了。然后它会创建另一个 canvas 大小的原始图像并填充多个平铺图像副本。然后它使用原始图像作为透明蒙版来创建具有与原始图像相同的透明单元格的新平铺图像的副本。

正如 Fred (fmw42) 所说,"why don't you just create the whole image from scratch?".

也许您的描述不完整,所以这里还有一些内容可能会帮助您解决问题。

给定 bluetiles.pngsinglered.png

你可以像这样随意放置红色的:

convert bluetiles.png \
   singlered.png -geometry +0+32  -composite \
   singlered.png -geometry +32+96 -composite result.png


给定 bluewithtransparent.png:

您可以像这样将其透明度复制到 newly-created 图像:

convert bluetiles.png \
   singlered.png -geometry +0+32  -composite \
   singlered.png -geometry +32+96 -composite \
\( bluewithtransparent.png -alpha extract \) -compose copyopacity -composite result.png