我想将图像(orig.jpg)剪切成16px x 16px的片段,随机化它们的顺序并将它们放到一个相同大小的新图像(jpg)中。基本上是马赛克效果,但没有顺序。
分裂不是问题
convert -crop 16x16@ orig.jpg tile_%d.jpg
但我不知道如何将它们随机组合在一起......
montage
我应该做的伎俩。我以前做过,但找不到脚本:-S
全部使用:我需要具有完全相同颜色和亮度的图像,但不能识别原始图像。
答案 0 :(得分:4)
您可以使用bash
和ImageMagick
执行此操作:
#!/bin/bash
convert -crop 16x16@ input.jpg tile.jpg
montage -geometry +0+0 $(ls tile*jpg | awk 'BEGIN{srand()}{print rand() "\t" $0}' | sort -n | cut -f2-) output.png
# Remember to remove the tile*jpg before you do another one :-)
# rm tile*jpg
基本上如你所知,使用-crop
和montage
。 $()
内的位是进程替换,它将在括号内运行进程并将其放入montage
命令。它列出了所有名为tile*jpg
的文件,并将其导入awk
以在每个文件的前面附加一个随机数,然后按随机数排序并将其删除。
所以这就是:
进入这个:
我一直在进一步尝试这个(即玩),我发现你可以在瓷砖之间获得白线和间隙。我不确定这些是否会打扰你,但如果他们这样做,可能的解决方案是记下原始图像几何体,然后将其调整为16x16瓷砖大小的精确倍数。然后像以前一样继续,并按结尾的奇数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" $0}' | sort -n | cut -f2-) JPG:- | convert JPG: -resize ${origgeom}! output.jpg