我想用graphicsmagick创建一个在宽度和高度上平铺的单个图像的图像。
我尝试了此命令:
gm montage -geometry 2x2 mypic.png mypic.png mypic.png out.png
但是,我想重复多次这种图案图像(超过100x100)。
是否可以在不重复mypic.png
10000次的情况下做到这一点?吗?
答案 0 :(得分:3)
我不知道GraphicsMagick。但是我认为它类似于ImageMagick,因为它是ImageMagick的衍生产品。在ImageMagick中,您可以通过两种方式轻松地做到这一点:
输入:
montage lena.jpg -duplicate 24 -tile 5x5 -geometry +0+0 result.jpg
convert -size 1280x1280 tile:lena.jpg result2.jpg
查看在https://imagemagick.org/Usage/canvas/#tile上进行平铺的各种方法
我不确定GraphicsMagick是否具有-duplicate,因为ImageMagick 6.6.8-10在2011年3月27日引入后很久才引入。
ImageMagick具有比GraphicsMagick更多的功能,但可能会稍微慢一些。您可能要考虑使用ImageMagick而不是GraphicMagick
答案 1 :(得分:3)
您没有说打算制作多大的图像,但是如果图像很大,则会遇到很多问题。
首先,JPEG限制为65536 x 65536像素,因此,如果需要更大的像素,则需要bigtiff或PNG之类的东西。
其次,您可能需要大量内存才能组成大图像。例如,在这台笔记本电脑上,我可以运行:
$ time convert -size 50000x50000 tile:k2.jpg result.jpg
real 6m11.366s
user 1m19.671s
sys 0m20.836s
在大约6m的时间内制作50k x 50k像素的JPG。
convert
将在开始写入结果之前组装整个图像。如果您没有大量的RAM,它将使用一个巨大的临时文件。如果在处理期间查看/tmp
,我会看到:
$ ls -l /tmp
total 1199684
-rw------- 1 john john 20000000000 Dec 1 15:56 magick-9559WtN2jwPlvrMm
一个20GB的临时文件。那是50000 * 50000 * 4 * 2,所以它正在制作一个16位,四通道的临时映像。由于convert
的所有时间都花在了磁盘IO上,因此速度相当慢。
您可以考虑使用其他系统-libvips是一个流图像处理库,因此它可以执行这样的命令,而不必制作完整的中间图像。我看到了:
$ time vips replicate k2.jpg result.jpg 35 25
real 0m13.592s
user 0m16.383s
sys 0m1.426s
$ vipsheader result.jpg
result.jpg: 50750x51200 uchar, 3 bands, srgb, jpegload
也就是说,将k2.jpg
水平复制35次,垂直复制25次,以使图像略大于50k x 50k。它不会创建临时文件,并且会在大约15秒内完成。处理非常大的输出图像不会有问题-我会定期处理300,000 x 300,000像素的图像(显然不是jpg格式)。