我希望使用Windows中的任何程序以4 x 2图片的形式连接两个尺寸为21600px x 21600px的png图片。尝试使用ImageMagick或GraphicsMagick会导致错误(由于任何尺寸限制为65500px)。
我也用gimp尝试过,但对我的电脑来说太过分了(和gimp)。我更喜欢轻型程序甚至是命令行程序。你有什么建议吗?
答案 0 :(得分:1)
您可以尝试libvips。它是一个流式图像处理库 - 它可以同时解压缩,处理和重新压缩所有内容,因此您只需要足够的内存来处理实际处理的小块像素。
您可以从命令行加入图像,如下所示:
vips arrayjoin "1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png" x.png --across 4
它会制作x.png
,这是在网格中连接8个源图像的结果,其中包含四个图像。图像从左到右,从上到下排列,因此您可以获得:
1 2 3 4
5 6 7 8
在这台笔记本电脑上,我看到了:
$ time vips arrayjoin "1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png" x.png --across 4
real 5m38.236s
user 7m9.735s
sys 0m2.851s
peak res 249mb
$ vipsheader x.png
x.png: 74976x37488 uchar, 3 bands, srgb, pngload
因此它在大约五分钟内产生了70k x 40k像素的png和250mb的内存。你会发现大部分时间花在libpng压缩上 - tiff格式至少要快三到四倍。
在Windows上,arrayjoin
可以在一次操作中加入最多约2,000张图像。更重要的是,你需要分阶段组装。
您可以在此处下载Windows二进制文件:
https://github.com/jcupitt/libvips/releases
arrayjoin
的文档在这里:
http://jcupitt.github.io/libvips/API/current/libvips-conversion.html#vips-arrayjoin
它有网格布局和对齐选项,可能很有用。
答案 1 :(得分:1)
感谢您的想法!最后我用vips连接图片,主要问题是实际显示图片,因为第一台计算机没有足够的RAM(16 GB)。它始终显示最终图片(86'400 x 21'600像素),底部有黑线(如https://ibb.co/bPGHnb)
要显示图片,我使用的是32 GB RAM的计算机。 Magick无法显示它,因为它无法分配足够的RAM。但是irfantview终于做到了。
答案 2 :(得分:0)
如果限制不是来自PNG,您的ImageMagick policy.xml文件可能允许您创建更大的图像。见http://www.imagemagick.org/source/policy.xml
<policy domain="resource" name="width" value="10MP"/>
<policy domain="resource" name="height" value="10MP"/>
<policy domain="resource" name="area" value="100MP"/>
使用:
convert -list resource
告诉你当前的价值是多少。例如,我得到
convert -list resource
Resource limits:
Width: 214.7MP
Height: 214.7MP
Area: 17.18GP
Memory: 8GiB
Map: 16GiB
Disk: unlimited
File: 192
Thread: 4
Throttle: 0
Time: unlimited
但是如果你没有足够的RAM来容纳那么大小的图像和输入图像。您可能必须使用policy.xml文件映射到磁盘,但速度会慢一些。
4 * 21600 = 86400.因此,您的宽度限制需要大约87 Mpixels宽。
您的区域需要为8 * 21600 * 21600 = 3732480000或大约3.7 Mpixels区域。
8image * 24Bytes * 21600 * 21600 = 89579520000字节或大约90 GB,输入和输出数据需要加倍。我怀疑这可能比你的RAM数量还要大。
请注意,即使您的PNG已压缩,ImageMagick也必须在处理之前对其进行解压缩。