什么C库可以缩放巨大的图像?

8

Consider the following file:

-rw-r--r-- 1 user user 470886479 2009-12-15 08:26 the_known_universe.png

如何在使用不超过4GB的RAM的情况下,将图像缩小到合理的分辨率?

例如:

$ convert -scale 7666x3833 the_known_universe.png

哪个C库可以处理它?

谢谢!


2
重新定义已知宇宙,使其适应直径为七百零五米的球形区域。地图将更小,更易于操作。 - Nicholas Knight
不知道你有没有尝试使用ImageMagick来完成这个任务?如果我没记错的话,如果你已经安装了它,你几乎可以输入完全相同的命令,但我猜ImageMagick可能无法处理它。 - Joey Adams
2
@Dave Jarvis:也许你最好把时间花在寻找事物上。那些你需要的事物。那些能让你前进的事物。 - Jesse Dhillon
7个回答

4
我相信libpng有一个流接口。我认为这可以用来一次读取图像的一部分;根据图像文件,您可能能够按顺序获取行。然后,您可以缩小每行(例如,对于50%的缩小,水平缩小行并丢弃每个第二行),并写入输出文件。
在C中使用libpng可能需要相当数量的代码,但文档会很好地指导您完成。

http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.8


+1 - 这是正确的方法。我曾经需要处理NASA图像的类似问题,使用了流式API。 - Anon

1

libvips 能够轻松处理大型图像。它是一个流式图像处理库,因此可以同时并行地从源读取、处理和写入目标。通常比imagemagick快3倍到5倍,并且需要很少的内存。

例如,对于我笔记本电脑上最大的PNG文件(1.8GB),我可以使用以下命令将其缩小10倍:

$ vipsheader huge.png
huge.png: 72000x72000 uchar, 3 bands, srgb, pngload
$ ls -l huge.png 
-rw-r--r-- 1 john john 1785845477 Feb 19 09:39 huge.png
$ time vips resize huge.png x.png 0.1
real    1m35.279s
user    1m49.178s
sys 0m1.208s
peak RES 230mb

不算快,但也不算太差。PNG格式比较慢,用TIFF会更快。 libvips可以通过大多数软件包管理器进行安装(例如macOS上的homebrew,Debian上的apt),还有一个Windows二进制文件,并且它是免费的(LGPL)。除了命令行之外,还有C、C ++、Python、Ruby、Lua、node、PHP等绑定。

1

你还需要确保每个通道编译为8位。 - Gabe

1

我几年前使用过cximage。我认为最新版本在CodeProject之后迁移到了http://www.xdp.it/cximage.htm

编辑:抱歉,它是C++而不是C。


1

你可以使用一个用于对大(小)图像执行复杂操作的图像处理库。一个例子是IM成像工具包。它与C语言链接良好(但至少部分实现是C++),并且与Lua有良好的绑定。从Lua绑定开始实验应该很容易。


0
你考虑过探索基于金字塔的图像吗?想象一下,图像被分成多层金字塔,每一层都有不同的分辨率。每一层都被分成块。 这样,您就可以显示图像的缩小版本,以及图像的缩放局部视图,而无需重新缩放。
参见维基百科条目
最初的格式之一是FlashPix,我为其编写了渲染器。我还创建了一个新格式的金字塔转换器和渲染器,用于医疗应用。实际扫描仪将产生90GB +的器官切片扫描结果,用于癌症研究。 转换器的算法实际上非常棘手,要有效地生成金字塔图像。信不信由你,它实际上是基于Java的,并且性能比你想象的要好得多。它使用多线程。基准测试表明,C语言版本不可能做得更好。 这是6年前的事了。我做原始渲染器是在10年前了。 现在这些金字塔图像不再被人提及了。但这确实是唯一一种在需求时高效地生成缩放图像而不必生成缓存的缩放版本的方法。

Jpeg2000可能具有可选的金字塔功能。

我记得ImageMagick的支持格式和转换或许包括FlashPix。谷歌搜索“图像金字塔”会显示一些有趣的结果。勾起了一些回忆;-)


0

如果您可以将其移动到64位操作系统上,则可以将其作为内存映射文件或等效文件打开,并使用几乎任何库。它不会很快,并且可能需要增加页面/交换文件(取决于操作系统和您想要执行的其他操作),但作为回报,您将不受流式库的限制,因此在进行分辨率降低或切片之前,您将能够执行更多的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接