首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接巨大的图片

连接巨大的图片
EN

Stack Overflow用户
提问于 2017-11-01 04:51:18
回答 3查看 345关注 0票数 0

我想连接八个png图片,每个在21600px x 21600px的大小在4x2图片的形式使用windows中的任何程序。尝试ImageMagick或GraphicsMagick会导致错误(由于任何尺寸的限制为65500px )。

我也用gimp尝试过,但它对我的电脑(和gimp)来说太多了。我更喜欢轻量级程序,甚至是命令行程序。你有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2017-11-04 22:28:25

你可以试试libvips。它是一个流式图像处理库--它可以同时解压缩、处理和重新压缩,所以你只需要足够的内存来处理实际正在处理的一小块像素。

您可以从命令行连接映像,如下所示:

代码语言:javascript
复制
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个源图像连接到一个网格中的结果,其中有4个图像。图像是从左到右和从上到下排列的,所以你会得到:

代码语言:javascript
复制
1 2 3 4
5 6 7 8 

在这台笔记本电脑上,我看到:

代码语言:javascript
复制
$ 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

因此,它在大约5分钟和250mb的内存中制作了一个70k x 40k像素的png。您会发现大部分时间都花在了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
EN

Stack Overflow用户

发布于 2017-11-15 15:44:34

感谢您的想法!最后我把图片和vips连接起来,主要的问题实际上是显示图片,因为第一台计算机没有足够的RAM (16 GB)。它总是显示最终的图片( 86'400 x 21'600像素),在底部有一条黑线(像这样的https://ibb.co/bPGHnb)

为了显示图片,我使用了一台内存为32 GB的计算机。Magick无法显示它,因为它无法分配足够的RAM。但irfantview最终还是成功了。

票数 1
EN

Stack Overflow用户

发布于 2017-11-01 06:40:20

如果限制不是来自PNG,您的ImageMagick policy.xml文件可能允许您创建更大的图像。请参阅http://www.imagemagick.org/source/policy.xml

代码语言:javascript
复制
<policy domain="resource" name="width" value="10MP"/> 
<policy domain="resource" name="height" value="10MP"/> 
<policy domain="resource" name="area" value="100MP"/> 

使用:

代码语言:javascript
复制
convert -list resource

告诉你你现在的价值是什么。例如,我得到

代码语言:javascript
复制
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。所以在你的宽度限制下,你需要大约87M像素的宽度。

您的面积需要是8*21600*21600 = 3732480000或大约3.7M像素的面积。

还有8images*24Bytes*21600*21600=89579520000字节或大约90 GB,输入和输出数据都需要加倍。我怀疑这可能比你的内存大。

请注意,即使您的PNG是压缩的,ImageMagick也必须在处理之前将其解压缩。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47044353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档