【问题标题】:ImageMagick: Replace All Image Tiles with Single TileImageMagick:用单个平铺替换所有图像平铺
【发布时间】:2018-03-21 00:56:31
【问题描述】:

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

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

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

这就是我想要的输出:

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

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

结果如下:

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

如何使用 ImageMagick 或其他软件做到这一点?如果使用 ImageMagick,montagecomposite 命令会是更好的选择吗?

编辑:另外一个问题,是否可以跳过完全透明的图块?

输入示例:

输出示例:

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

【问题讨论】:

    标签: imagemagick overlay placeholder tile tiling


    【解决方案1】:

    如果平铺图像均匀地适合原始尺寸,这样的命令应该可以满足您的大部分需求...

    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
    

    这在两个图像中都可以读取。然后它会创建另一个与原始大小相同的画布,并填充多个平铺图像副本。然后它使用原始图像作为透明蒙版来创建新平铺图像的副本,其中包含与原始图像相同的透明单元格。

    【讨论】:

    • 我可能做错了什么,但是这个命令给了我两个文件:“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”后缀?
    • 对不起,当我复制/粘贴命令时出现了我遗漏了一点的命令。我现在编辑了命令以在“+swap”之后添加“-compose copyopacity -composite”。尝试一下,如果它仍然无法满足您的要求,我们可以尝试修复它以使其正常工作。
    • 非常感谢GeeMack。起初我有点怀疑这种方法并没有完全阻挡每个图块,而是保留了透明度并且只覆盖了不透明的像素。但实际上,我已经决定这非常适合我想要使用它。
    【解决方案2】:

    我不知道您为什么需要在原件上叠加 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 来复制瓷砖,但它使用了一个相对较新的 -duplicate 功能。如果您没有足够当前版本的 Imagemagick,则只需在 montage 中重复该图块,如下所示:

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


    【讨论】:

    • 你是对的,我不需要“覆盖”原始图像。但是,我有许多不同尺寸的图像,尺寸都是 32 的倍数。这个答案对我有用。我只需要获取原始图像的尺寸,可以使用identify original.png | cut -d " " -f 3 完成。然后我只需要将 xy 值除以 32。
    • 我已经编辑了我的帖子以包括瓷砖数量的计算。
    • 非常感谢您的回答。很难在你的和 GeeMack 之间做出决定,我将它们都实现到了一个脚本中。我希望我可以选择多个,因为我认为这个也能回答这个问题。
    • 你不能同时投票吗?我认为这是可能的。但也许不适合写这个问题的人。
    • 是的,我对他们两个都投了赞成票。但我只能选择一个作为接受的答案
    【解决方案3】:

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

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

    给定bluetiles.pngsinglered.png

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

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


    给定bluewithtransparent.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2012-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多