使用无内存调整大型jpeg的大小

时间:2015-05-08 02:59:46

标签: delphi resize jpeg

我需要在没有RAM的情况下调整大量(最多30000x30000)JPEG文件的大小,速度并不重要,有什么办法吗?我尝试了不同的库(nativejpg和其他),但是他们使用了所有可用内存,并且崩溃了,例如"内存不足"或者"没有足够的存储空间来处理此命令"。我甚至尝试过命令行实用程序imagemagick,但它也使用了数十亿字节的内存。

3 个答案:

答案 0 :(得分:3)

我建议你看一下C:\Windows\System32。记录here

我可以使用ImageMagick

创建一个10000x10000的噪声图像
vips

并检查它是否是正确的大小:

convert -size 10000x10000! xc:gray50 +noise poisson image.jpg

我现在可以使用identify image.jpg image.jpg JPEG 10000x10000 10000x10000+0+0 8-bit sRGB 154.9MB 0.000u 将10000x10000图像调整为2500x2500,如下所示

vips

请注意,内存使用量最高只有20MB

使用ImageMagick

检查结果
time vipsthumbnail image.jpg -s 2500 -o small.jpg --vips-leak
memory: high-water mark 20.48 MB

real    0m1.974s
user    0m2.158s
sys     0m0.096s

关于性能和内存使用情况,请查看技术说明 - here

您也可以从identify result.jpg result.jpg JPEG 2500x2500 2500x2500+0+0 8-bit sRGB 1.33MB 0.000u 0:00.000 以及命令行调用它。

答案 1 :(得分:2)

如果启用libjpeg shrink-on-load,可以使用imagemagick执行此操作。尝试:

$ identify big.jpg 
big.jpg JPEG 30000x30000 30000x30000+0+0 8-bit sRGB 128MB 0.000u 0:00.000
$ time convert -define jpeg:size=2500x2500 big.jpg -resize 2500x2500 small.jpg
real    0m3.169s
user    0m2.999s
sys 0m0.159s
peak mem: 170MB

这是如何工作的:libjpeg具有很好的收缩负载功能。当您打开图像时,您可以要求库在加载过程中按x2,x4或x8进行下采样 - 然后库只解码每个DCT块的一部分。

但是,打开图像时必须启用此功能,以后不能设置。因此convert需要提示,当它打开big.jpg时,它只需要获得至少大小为2500x2500(目标大小)的图像。现在所有-resize正在做的是将3800x3800像素图像缩小到2500x2500,这是一个非常简单的操作。您只需要1/64的CPU和内存。

正如@ mark-setchell所述,vipsthumbnail更快:

$ time vipsthumbnail big.jpg -s 2500 -o small.jpg --vips-leak
memory: high-water mark 29.93 MB
real    0m2.362s
user    0m2.873s
sys 0m0.082s

尽管加速并不是非常引人注目,但由于两个系统实际上只是调整了3800的大小 - > 2500.

如果您尝试使用tif,那么您确实会看到很大的差异,因为您可以使用没有按需加载的技巧:

$ identify 360mp.tif 
360mp.tif TIFF 18000x18000 18000x18000+0+0 8-bit sRGB 972MB 0.000u 0:00.000
$ time convert 360mp.tif -resize 2500 x.tif
peak mem: 2.8 GB
real    0m8.397s
user    0m25.508s
sys 0m1.648s
$ time vipsthumbnail 360mp.tif -o x.tif -s 2500 --vips-leak
memory: high-water mark 122.08 MB
real    0m2.583s
user    0m9.012s
sys 0m0.308s

现在vipsthumbnail大约快4倍,只需要内存的1/20。

答案 2 :(得分:1)

借助内置的Delphi Jpeg支持,您可以加载大型jpeg图像重新采样到较小的尺寸,同时加载时不会过度使用RAM。

Jpeg图像缩放属性可以包含以下值point2Apoint2B

jsFullSize

一旦您将图像大小重新调整为可以在内存中舒适处理的大小,您就可以应用普通的缩放算法来获得所需的实际图像大小。