ImageMagick:将所有图像分幅替换为单个分幅

ImageMagick:将所有图像分幅替换为单个分幅,imagemagick,overlay,placeholder,tile,tiling,Imagemagick,Overlay,Placeholder,Tile,Tiling,我认为ImageMagick是最好的选择,但是如果您有其他可以编写脚本的建议,请告诉我 我正在尝试用一个瓷砖替换图像的所有32x32瓷砖。这是原始图像的一个示例: 这是我要用来替换原始图像上所有平铺的平铺: 这就是我想要的输出: 我从Stack Overflow上的其他帖子中发现,我可以使用ImageMagick的复合选项将平铺覆盖到原始图像上: $convert original.png tile.png-composite overlay.png 结果如下: 我假设通过了解原始图像的

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

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

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

这就是我想要的输出:

我从Stack Overflow上的其他帖子中发现,我可以使用ImageMagick的复合选项将平铺覆盖到原始图像上:

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

结果如下:

我假设通过了解原始图像的尺寸,我可以手动覆盖瓷砖多次。但是有没有一种方法可以自动化这个过程呢。在我给出的示例图片中,我需要在原始64x128图像上覆盖瓷砖8次

如何使用ImageMagick或其他软件进行此操作?如果使用ImageMagick,蒙太奇或合成命令会是更好的选择吗

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

输入示例:

输出示例:


能够做到这一点并不重要,但那就太好了。

我不知道你为什么需要在原作上覆盖8块瓷砖。只需从头开始创建,并将输出命名为与原始输出相同的名称

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


在这里,我使用convert复制了平铺,但它使用了相对较新的复制功能。如果您没有足够的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
这两种图像都可以读取。然后,它创建另一个画布,其大小与原始画布相同,并填充了平铺图像的多个副本。然后,它使用原始图像作为透明遮罩,创建新平铺图像的副本,并使用与原始图像相同的透明单元格。

正如Fred(fmw42)所说,“为什么不从头开始创建整个图像?”

也许你的描述不完整,所以这里还有几条可能会帮助你解决这个问题

给定
bluetiles.png
singlered.png

您可以按如下方式定位红色的:

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


给定
bluewithtransparent.png

可以将其透明度复制到新创建的图像,如下所示:

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

您说得对,我不需要“覆盖”原始图像。但是,我有很多不同大小的图像,所有的尺寸都是32的倍数。这个答案对我确实有用。我只需要获得原始图像的尺寸,这可以通过
identification original.png | cut-d”“-f3
完成。然后我只需要将x&y值除以32。我已经编辑了我的帖子,其中包括了瓷砖数量的计算。我非常感谢你的回答。很难在你和GeeMack之间做出决定,我将它们都实现到一个脚本中。我希望我能选择多个,因为我认为这一个也能回答这个问题。你能不能两个都投票?我认为这是可能的。但可能不是针对写问题的人。是的,我对他们两人都投了赞成票。但我只能选择一个作为接受答案。我可能做错了什么,但这个命令给了我两个文件:“overlay-0.png”和“overlay-1.png”。“overlay-0.png似乎是“tile.png”的副本,而“overlay-1.png”是“original.png”的副本。好吧,我一开始肯定做错了什么,因为我复制并粘贴了您的命令,该命令有不同的输出。它仍然给了我两个文件,“overlay-0.png”和“overlay-1.png”。但这次是“overlay-0.png”“有我想要的输出。有没有办法禁止输出第二个文件&添加“-0”后缀?很抱歉,当我复制/粘贴命令时,它会出现,我遗漏了一点。我现在编辑了命令,在“+交换”之后添加“-compose copyopacity-composite”。试试看,如果它仍然不能达到你想要的效果,我们可以试着修复它。非常感谢GeeMack。起初,我有点怀疑这种方法并没有完全屏蔽每个瓷砖,而是保留了透明度&只覆盖不透明像素。但事实上,我已经决定,这是完美的工作,我想用它。