【问题标题】:Java : compress image without fully load themJava:压缩图像而不完全加载它们
【发布时间】:2009-09-02 18:56:54
【问题描述】:

我正在创建一个将图片发送到 servlet 的小程序。

小程序的第一个动作是调整图片大小和压缩图片。 我正在使用 ImageIO 将图片加载到 BufferedImage 中。接下来我调整图片大小,然后使用 ImageWriter 将其压缩为 jpeg。没问题。

问题是当用户发送一个非常大的图片(高达 70MP)时。 BufferedImage 中图像的加载超出堆大小并引发“内存不足”异常。

我怎样才能避免这种情况?

是否可以压缩图片而不将其完全加载到内存中?也许只使用流?还是加载 subImage ?

对不起,我的英语不好, 感谢您的回答。

【问题讨论】:

  • 您使用的是哪种压缩方式?您是更改为不同的图像压缩类型还是只是压缩图像数据?

标签: java image stream


【解决方案1】:

简短的回答是“增加你的堆大小”,但我认为你真的很关心将这么多的东西读入内存,即使它是可能的。

由于 ImageIO.write() 需要一个 RenderedImage,并且唯一可用的实现是 BufferedImage,它会读入内存,我想说下一个最好的选择是使用一个可以读取部分内容的类来实现 RenderedImage 接口按需提供图像文件,而不是内存中的全部内容。这可能非常慢,具体取决于您如何实现它以及编码器如何访问图像。

我想你可以考虑保存到磁盘,也许可以调用一个可以执行翻译的命令行程序。这会很笨拙,但有可能一些不错的命令行工具可以更有效地执行这些操作,也许不在内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多