我正在创建一个将图片发送到servlet的applet。
小程序的第一个动作是调整大小并压缩图片。 我正在使用ImageIO将图片加载到BufferedImage中。接下来,我调整图片大小,然后使用ImageWriter在jpeg中压缩它。这很好。
问题是用户发送非常大的图片(最高70MP)。 BufferedImage中图像的加载超出了堆大小并引发“内存不足”异常。
我该如何推荐?
是否可以压缩图片而不将其完全加载到内存中?也许只使用流?或加载subImage?
对不起我的英语不好, 谢谢你的导师。
答案 0 :(得分:0)
简短的回答是“增加你的堆大小”但我认为你真的很担心在内存中读取这么多内容,即使有可能。
由于ImageIO.write()需要一个RenderedImage,并且唯一可用的实现是BufferedImage,并且它读入内存,我想你的下一个最好的选择是使用一个可以读取部分内容的类来实现RenderedImage接口。按需提供图像文件,而不是内存中的整个内容。这可能非常慢,具体取决于您如何实现它以及编码器如何访问图像。
我想您可以考虑保存到磁盘并调用可以执行转换的命令行程序。这将是一种愚蠢的行为,但有一些很好的命令行工具可以更有效地完成这些操作,也许不会在内存中。