我正在使用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类来绕过这个限制?
答案 0 :(得分:2)
不,数组大小限制在JVM和Java规范中是硬连线的。
要解决您的问题,您需要从简单的图像和栅格中抽象出来。大图像可以细分为多个较小的图像,每个图像只包含大图像的一个小矩形部分。
这对你遇到的例外情况没有帮助。关于ImageIO内部处理图像的方式,你无能为力(除了可能将限制注册为bug)。您需要找到一个备用库来读取 大小的图像,或者自己编写代码(很多工作要确定)。
编辑:创建BufferedImage的子类对你没有帮助,BufferedImage只是底层结构(Raster,DataBuffer)的一个薄外观,最终硬连线使用数组进行存储。而你仍然会遇到问题ImageIO创建原始BufferedImage类的实例。