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

标签 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");

结果是:

Message: before image
Free memory (bytes): 82554768
Maximum memory (bytes): 129957888
Total memory (bytes): 85000192

Message: after image
Free memory (bytes): 42600680
Maximum memory (bytes): 129957888
Total memory (bytes): 85000192

因此加载该图像需要 82554768 - 42600680 = 39954088 字节 = 38 MB

照片大小为3.3 MB

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

最佳答案

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

您有一个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)。

图像很大。

关于java - 内存中的图像消耗的内存远多于其文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175736/

相关文章:

java - 设计服务启动界面

javascript - 上传文件扩展名过滤器选项不起作用?

c++ - 在以下情况下,我可以避免在 C++ 中复制 unordered_map 吗?

内存分配时的 C++ 错误

c++ - char* 和 new 的一些错误

java - FloatingActionButton Sub 无法调用 Codename One 中的另一个表单

java - 如何实现 Accordion 式菜单?

java - 无法访问 War 文件中的图像

html - 图片上有一个奇怪的图标和轮廓

html - 在灵活的 div 中垂直和水平居中图像