连接巨幅图片

时间:2017-10-31 20:51:18

标签: image-processing

我希望使用Windows中的任何程序以4 x 2图片的形式连接两个尺寸为21600px x 21600px的png图片。尝试使用ImageMagick或GraphicsMagick会导致错误(由于任何尺寸限制为65500px)。
我也用gimp尝试过,但对我的电脑来说太过分了(和gimp)。我更喜欢轻型程序甚至是命令行程序。你有什么建议吗?

3 个答案:

答案 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也必须在处理之前对其进行解压缩。