我需要在没有RAM的情况下调整大量(最多30000x30000)JPEG文件的大小,速度并不重要,有什么办法吗?我尝试了不同的库(nativejpg和其他),但是他们使用了所有可用内存,并且崩溃了,例如"内存不足"或者"没有足够的存储空间来处理此命令"。我甚至尝试过命令行实用程序imagemagick,但它也使用了数十亿字节的内存。
答案 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图像缩放属性可以包含以下值point2
,A
,point2
,B
jsFullSize
一旦您将图像大小重新调整为可以在内存中舒适处理的大小,您就可以应用普通的缩放算法来获得所需的实际图像大小。