如何将图像切成碎片,随机化并将它们放在一起

How to cut image into pieces, randomize them and put all together

我想将一张图片 (orig.jpg) 裁剪成 16px x 16px 的碎片,将它们的顺序随机化,然后将它们放在一个相同大小的新图片 (jpg) 中。基本上是马赛克效果,但没有顺序。

拆分不是问题

convert -crop 16x16@ orig.jpg  tile_%d.jpg

但我不知道如何将它们随机组合在一起...

montage 

我猜应该可以解决问题。我以前做过,但找不到脚本:-S

全部的使用:我需要颜色和亮度完全相同的图片,但应该无法识别原图。

你可以这样用 bashImageMagick:

#!/bin/bash
convert -crop 16x16@ input.jpg tile.jpg
montage -geometry +0+0 $(ls tile*jpg | awk 'BEGIN{srand()}{print rand() "\t" [=10=]}' | sort -n | cut -f2-) output.png

# Remember to remove the tile*jpg before you do another one :-)
# rm tile*jpg

基本上按照你的建议,使用-cropmontage$() 中的位是 进程替换 并且它将 运行 括号内进程的结果放入 montage 命令中。它列出了所有名为 tile*jpg 的文件并将其通过管道传输到 awk 以在每个文件的前面附加一个随机数,然后按随机数排序并将其切掉。

所以它使这个:

进入这个:

我一直在对此进行进一步试验(即 玩弄),我发现您可以在瓷砖之间得到白线和间隙。我不确定这些是否打扰你,但如果他们打扰了,一个可能的解决方案是记录原始图像的几何形状,然后将其调整为 16x16 tile-size 的精确倍数。然后像以前一样,在最后调整0-15个奇数像素,回到原来的大小。

如果有必要,我想到了这个:

#!/bin/bash
# Get original image geometry
origgeom=$(identify -format %g input.jpg)
echo $origgeom
# Calculate new geometry as exact multiple of tilesize
newgeom=$(convert input.jpg -format "%[fx:int(w/16)*16]x%[fx:int(h/16)*16]" info:)
echo $newgeom

# Resize to new geometry and tile
convert input.jpg -resize $newgeom -crop 16x16@ tile.jpg

# Rebuild in random order then correct geometry
montage -background none -geometry +0+0 $(ls tile*jpg | awk 'BEGIN{srand()}{print rand() "\t" [=11=]}' | sort -n | cut -f2-) JPG:- | convert JPG: -resize ${origgeom}! output.jpg