gpt4 book ai didi

java - 如何转换和写入大图像而不导致 OOM 错误?

转载 作者:行者123 更新时间:2023-12-02 08:10:30 25 4
gpt4 key购买 nike

我将图像以 ImageIcons 的形式存储在数据库中,我希望将其提供给我们的网页,但是对于大图像,我遇到了内存不足的异常。

这是我目前的做法,

[编辑]我扩展了 ImageUtilities 以提供一个非透明的 BufferedImage,从而简化了代码,

BufferedImage rgbbi = ImageUtilities.toBufferedImage(icon.getImage());

ServletOutputStream out = null;
try {
// Get the Servlets output stream.
out = responseSupplier.get().getOutputStream();

// write image to our piped stream
ImageIO.write(rgbbi, "jpg", out);

} catch (IOException e1) {
logger.severe("Exception writing image: " + e1.getMessage());
} finally {
try {
out.close();
} catch (IOException e) {
logger.info("Error closing output stream, " + e.getMessage());
}
}

抛出的异常如下,

Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
at java.awt.image.Raster.createPackedRaster(Raster.java:458)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
at sun.awt.image.ImageRepresentation.createBufferedImage(ImageRepresentation.java:230)
at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:484)
at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:120)
at sun.awt.image.JPEGImageDecoder.sendPixels(JPEGImageDecoder.java:97)
at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
at sun.awt.image.JPEGImageDecoder.produceImage(JPEGImageDecoder.java:119)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
...

有没有办法可以重写它以流式传输 ImageIO.write 的输出并以某种方式限制其缓冲区大小?

[编辑]我也不能只增加堆大小,我需要提供的图像在 10000x7000 像素范围内,作为一个字节数组,计算出 (10000px x 7000px x 24bits) 280MB。我认为在 servlet 中为图像转换分配的堆大小是不合理的。

示例图像 Large

最佳答案

正如评论中所指出的,将 10000x7000 图像作为 ImageIcons 存储在数据库中,并通过 servlet 提供它们,听起来是糟糕的设计。尽管如此,我指出这一点PNGJ库(免责声明:我对其进行了编码),允许您按顺序逐行读取/写入 PNG 图像。当然,只有当您以这种格式存储大图像时,这才有用。

关于java - 如何转换和写入大图像而不导致 OOM 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7517199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com