0

我正在使用 Java 程序进行一些图像处理,目前我正在处理一些相当大的图像(在千兆像素的数量级上)。

毫不奇怪,由于以下异常,我无法做很多事情:

Exception:
java.lang.IllegalArgumentException: Array size > Integer.MAX_VALUE!
    at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1064)
    at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1046)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1014)
    at javax.imageio.ImageIO.read(ImageIO.java:1422)
    at javax.imageio.ImageIO.read(ImageIO.java:1282)
...

我想知道是否有任何方法可以通过用另一个支持大图像的兼容类重载 BufferedImage 类来规避这个限制?

4

1 回答 1

2

不,数组大小限制在 JVM 和 java 规范中是硬连线的。

要解决您的问题,您需要从简单的图像和栅格中进行抽象。大图像可以细分为多个较小的图像,每个较小的图像仅包含大图像的一个小矩形部分。

不过,这对您没有帮助。对于 ImageIO 在内部处理图像的方式,您无能为力(除了可能将限制注册为错误)。您将需要找到一个备用库来读取大小的图像,或者自己编写代码(可以肯定的是很多工作)。

编辑:创建 BufferedImage 的子类对您没有帮助,BufferedImage 只是底层结构(Raster、DataBuffer)的一个薄外观,最终硬连线以使用数组进行存储。而且您仍然会在 ImageIO 创建原始 BufferedImage 类的实例时遇到问题。

于 2013-10-13T18:01:15.410 回答