gpt4 book ai didi

java - 如何在Java中加载大图像

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:34 26 4
gpt4 key购买 nike

我正在尝试用 Java 加载大图像文件,如果文件太大,我会收到内存错误消息(我已经尝试通过命令行标志增加堆大小)。

我正在使用以下方式加载图像:

如果图像不是 tiff 图像,我将使用此代码:

BufferedImage img = ImageIO.read(fileToOpen);

如果文件是 tiff,我将使用此代码:

BufferedImage img = JAI.create("fileload", 
fileToOpen.getAbsolutePath()).getAsBufferedImage();

我的问题实际上归结为:图像处理程序(例如 Photoshop)如何加载数百兆字节的文件而不会出现内存错误?

据我了解,20MB 的 jpeg 难以加载到内存中的原因是,例如,当加载到 BufferedImage 中时,您正在以未压缩的方式保存图像。因此,一种可能的解决方案是拥有一个 Java 类,它是 Image 抽象类的子类,但以压缩形式存储数据。但这可能会出现速度问题,因为运行时机器必须在绘图时解压缩数据。另一种选择是将原始未压缩数据缓存到磁盘并从那里无缝读取,但速度问题仍然存在。

那么大佬们是怎么做到的呢? Photoshop 如何在内存中加载一个 200MB 的 jpeg 并绘制它的所有分辨率而没有任何明显的问题?

(最后说明:在我的应用程序中,由于速度问题,在我获得 BufferedImage 后,我将其内容绘制到具有相同尺寸的 VolatileImage 上。这大大提高了绘制速度)

最佳答案

未压缩的 RGBA 图像所需的内存是宽度 * 高度 * 4 个字节。尝试根据这个设置你的内存。底层 JDK/DirectX/等可能有大小上限限制。系统。

大佬们利用了JPG图片的结构,不需要加载到内存中。也许他们每次都直接从文件中提取它。

BufferedImage 具有类似volatile image 的自动加速能力。将加速优先级设置为 1,第一次绘制会将其移动到最新 JDK 上的 VRAM。

编辑 我假设您运行的是 32 位系统。如果未压缩的图像非常大,超过 1.4GB,由于 JVM 限制,您将无法在内存中处理它。如果图像不是一次性图像,那么您可以找到工具将其流式解压缩为临时原始图像,并使用随机文件访问来获取其中的一部分。

关于java - 如何在Java中加载大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1119531/

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