我正在使用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
拿这么多记忆是否正常???为什么它消耗这么多内存?有什么方法可以减少这个,希望保持照片质量吗?
答案 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或其他库等方式对图像进行缩减采样。