考虑以下文件:
-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库会处理什么?
谢谢!
答案 0 :(得分:4)
我相信libpng有一个流界面。我认为这可以用来一次读取部分图像;根据图像文件,您可以按顺序获取行。然后,您可以缩小每一行(例如,缩小50%,水平收缩线并丢弃每一行)并写入输出文件。
在C中使用libpng可能需要相当多的代码,但文档会指导您完成这些代码。
http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.8
答案 1 :(得分:1)
您可以尝试制作64位版本的ImageMagick或查看是否有。我的同事写了一个带有超级简单的png解码器的博客(假设你有zlib或同等版本),所以你可以看到你需要自己编写的代码。
http://www.atalasoft.com/cs/blogs/stevehawley/archive/2010/02/23/libpng-you-re-doing-it-wrong.aspx
您需要在阅读时进行重新采样。
答案 2 :(得分:1)
几年前我用过cximage。我认为最新版本是 http://www.xdp.it/cximage.htm 离开CodeProject后。
编辑:抱歉,这是C ++而不是C.
答案 3 :(得分:1)
您可以使用旨在对大(和小)图像执行复杂操作的图像处理库。一个例子是IM imaging toolkit。它与C很好地连接(但至少部分在C ++中实现)并且与Lua具有良好的绑定。从Lua绑定来看,它应该很容易实验。
答案 4 :(得分: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上自制,在Debian上为apt),there's a Windows binary,并且它是免费的(LGPL)。除了命令行之外,还有C,C ++,Python,Ruby,Lua,节点,PHP等的绑定。
答案 5 :(得分:0)
您是否考虑过探索基于金字塔的图像?想象一个金字塔,其中图像被分成多个层,每个层具有不同的分辨率。每个图层都分为多个图块。 这样,您可以显示图像的缩小版本,也可以显示图像的放大部分视图,而无需重新缩放。
请参阅Wikipedia entry。
其中一种原始格式是FlashPix,我为其编写了一个渲染器。 我还创建了一种新的金字塔转换器和渲染器格式,用于医疗应用。一个实际的扫描仪将产生90GB +扫描一片器官用于癌症研究。 转换器的算法实际上非常棘手,以便有效地生成金字塔图像。信不信由你,它实际上是基于Java的,它的表现比你想象的要好得多。它使用多线程。基准测试显示C版本不太可能做得更好。这是六年前的事了。我10年前做过的原始渲染器。 这些天你再也听不到关于金字塔图像的任何信息了。但它确实是按需生成缩放图像的唯一有效方法,而无需生成缓存的缩放版本。
Jpeg2000可能也可能没有可选的金字塔功能。
我记得ImageMagick的支持者格式和转换可能包括FlashPix。 谷歌搜索“图像金字塔”揭示了一些有趣的结果。带回一些回忆; - )
答案 6 :(得分:0)
如果您可以将其移动到64位操作系统,则可以将其作为内存映射文件或等效文件打开,并使用您想要的任何库。它不会很快,可能需要增加页面/交换文件(取决于操作系统以及你想用它做什么),但作为回报,你将不会受限于流媒体库,所以你将成为能够在进行分辨率降低或切片之前进行更多操作。