内存中的图像消耗的内存远多于其文件大小

Ant*_*nio 2 java memory memory-management image

我正在使用 Java (Eclipse) 构建一个处理照片的应用程序。

因此,我使用此链接Java get available memory来了解我还有多少可用内存。问题是我有这段代码:

Main.printMemory("before image");
url = new File(information.getPath()).toURI().toURL();
image = ImageIO.read(url);
Main.printMemory("after image");
Run Code Online (Sandbox Code Playgroud)

结果是:

消息:图像之前
可用内存(字节):82554768
最大内存(字节):129957888
总内存(字节):85000192

消息:图像后
可用内存(字节):42600680
最大内存(字节):129957888
总内存(字节):85000192

所以加载该图像需要82554768 - 42600680 = 39954088 bytes = 38 MB

照片大小为 3.3 MB

占用这么多内存正常吗???为什么会消耗这么多内存呢?有什么方法可以减少这种情况,希望保持照片质量吗?

dhk*_*hke 7

压缩和编码图像的文件大小对于存储图像的内存要求来说是一个不好的指标。主内存中的图像通常是未压缩的,因为使用压缩编码会使图像操作变得更加复杂并且速度更慢。

您有一个4,000 x 3,000JPEG 图像。由于源是 JPEG 编码的,因此它可能会被加载ImageIO,这TYPE_INT_RGB意味着每个像素都需要4字节 (an int) 的存储空间。这意味着解码图像将占用所需4,000 x 3,000 x 4 = 48,000,000字节的内存。当 Java 支持 16 位颜色深度时,这个数字甚至可能更大。

它只需要〜38MB,听起来好像图像没有完全解压( ),但实际上在主内存中以某种打包编码(例如需要36MB)TYPE_INT_RGB表示。TYPE_3BYTE_BGR

图片很大。