内存中的图像占用的内存比文件大小

时间:2015-08-24 06:29:36

标签: java image memory memory-management

我正在使用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");

结果是:

  

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

  

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

因此,加载该图片需要82554768 - 42600680 = 39954088 bytes = 38 MB

照片尺寸为3.3 MB

拿这么多记忆是否正常???为什么它消耗这么多内存?有什么方法可以减少这个,希望保持照片质量吗?

2 个答案:

答案 0 :(得分:2)

压缩和编码图像的文件大小是存储图像的内存要求的错误指示。主内存中的图像通常是未压缩的,因为使用压缩编码会使图像操作更复杂,速度也更慢。

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

它只需要~38MB的声音就像图像没有完全解压缩(TYPE_INT_RGB)但实际上在一些打包编码中表示(例如TYPE_3BYTE_BGR需要36 MB)在主存储器中。

图像很大。

答案 1 :(得分:0)

这是正常的,是的。原因是大多数图像格式都以某种方式压缩 - 例如gif,jpeg和png也是如此 - 但BufferedReader却没有。也就是说,它独立地记录每个像素的数据,而不试图压缩或合并这些信息。这会产生更大的内存占用:宽x高x(每像素字节数)。如果最后一个是4个字节,你可以看到图片如何变得非常快。

如果您想要使用图像 - 旋转它们,过滤然后等等,那么您无能为力。这就是为什么照片编辑工具一直都是记忆猪!如果您不需要全分辨率,则可以使用imgscalr或其他库等方式对图像进行缩减采样。