java imagimage缓冲_使BufferedImage使用较少的RAM?

我的一个项目就是在图像流中快速读取图像时对其进行采样。向下采样将图像的尺寸减小到所需的宽度和高度,同时不需要进行昂贵的调整大小计算或修改磁盘上的图像。

因为我将图像采样到较小的尺寸,它还大大降低了显示图像所需的处理能力和RAM。为了进行额外的优化,我还将缓冲图像以平铺方式呈现…但这有点超出了讨论的范围。请尝试以下操作:

public static BufferedImage subsampleImage(

ImageInputStream inputStream,

int x,

int y,

IIOReadProgressListener progressListener) throws IOException {

BufferedImage resampledImage = null;

Iterator readers = ImageIO.getImageReaders(inputStream);

if(!readers.hasNext()) {

throw new IOException("No reader available for supplied image stream.");

}

ImageReader reader = readers.next();

ImageReadParam imageReaderParams = reader.getDefaultReadParam();

reader.setInput(inputStream);

Dimension d1 = new Dimension(reader.getWidth(0), reader.getHeight(0));

Dimension d2 = new Dimension(x, y);

int subsampling = (int)scaleSubsamplingMaintainAspectRatio(d1, d2);

imageReaderParams.setSourceSubsampling(subsampling, subsampling, 0, 0);

reader.addIIOReadProgressListener(progressListener);

resampledImage = reader.read(0, imageReaderParams);

reader.removeAllIIOReadProgressListeners();

return resampledImage;

}

public static long scaleSubsamplingMaintainAspectRatio(Dimension d1, Dimension d2) {

long subsampling = 1;

if(d1.getWidth() > d2.getWidth()) {

subsampling = Math.round(d1.getWidth() / d2.getWidth());

} else if(d1.getHeight() > d2.getHeight()) {

subsampling = Math.round(d1.getHeight() / d2.getHeight());

}

return subsampling;

}

要从文件获取ImageInputStream,请使用:

ImageIO.createImageInputStream(new File("C:\\image.jpeg"));

如您所见,此实现也尊重图像的原始纵横比。您可以选择注册一个IIoreadprogressListener,以便跟踪到目前为止读取了多少图像。这对于在网络上读取图像时显示进度条很有用,例如…但不是必需的,您可以只指定空值。

为什么这与你的处境特别相关?它永远不会将整个图像读取到内存中,就像您需要的那样,这样它就可以以所需的分辨率显示出来。对于巨大的图像,甚至是磁盘上10兆字节的图像,都能很好地工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值