- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试用 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/
我正在开发一个需要能够平均三个数字的 Facebook 应用程序。但是,它总是返回 0 作为答案。这是我的代码: $y = 100; $n = 250; $m = 300; $number = ($y
我只是无法弄清楚这一点,也找不到任何对我来说有意义的类似问题。我的问题:我从数据库中提取记录,并在我的网页上以每个面板 12 条的倍数显示它们。因此,我需要知道有多少个面板可以使用 JavaScrip
我是一名优秀的程序员,十分优秀!