所以,假设我想在Java中将一些PNG重新编码为JPEG.图像具有极高的分辨率,例如10 000 x 10 000px.使用“标准”Java映像API编写器和读取器,您需要在某些时候将整个映像解码到RAM中,这会占用极大的RAM空间(数百MB).我一直在寻找其他工具如何做到这一点,我发现ImageMagick使用磁盘像素存储,但这似乎对我的需求来说太慢了.所以我需要的是Tru streaming streamder.通过真正的流式传输,我的意思是通过chuncks或bin来读取和处理数据,而不仅仅是将流作为输入,而是事先对其进行解码.
现在,首先是背后的理论 – 在JPEG和PNG算法下,甚至可以使用流来实现这一点,或者说在数据箱中呢?所以不需要在内存(或其他存储)中编码整个图像?在JPEG压缩中,前几个阶段可以在流中完成,但我相信Huffman编码需要在量化后构建整个值概率树,因此需要分析整个图像 – 因此整个图像需要事先解码,或者以某种方式按需解码按地区划分.
如果能够实现以上这个黄金问题,是否有任何Java库可以以这种方式实际工作?并节省大量的RAM?
解决方法:
如果我创建一个10,000 x 10,000 PNG文件,充满不可压缩的噪音,使用ImageMagick如下:
convert -size 10000x10000 xc:gray +noise random image.png
我看到ImageMagick使用675M的RAM来创建最终的572MB文件.
我可以将它转换为带有这样的vips的JPEG:
vips im_copy image.png output.jpg
和vips在转换时使用不超过100MB的RAM,并且在4年左右的合理规格iMac上花费7秒 – 尽管使用SSD.