在java中尝试从非常大的图像文件中读取区域时出错

在java中尝试从非常大的图像文件中读取区域时出错,java,javax.imageio,twelvemonkeys,Java,Javax.imageio,Twelvemonkeys,我需要读取一个非常大的图像文件(56000像素X 49000像素)。我需要以小的矩形块来阅读它,所以我尝试遵循以下示例: 但是,我得到了这个错误:java.lang.IllegalArgumentException:width*height>Integer.MAX\u VALUE 下面是我的代码片段(大致取自上面的链接): ImageReader基类(JPEGImageReader和所有其他ImageIO读取器实现的超类)的getDestination方法中存在已知错误/限制,该方法计算输入图像

我需要读取一个非常大的图像文件(56000像素X 49000像素)。我需要以小的矩形块来阅读它,所以我尝试遵循以下示例:

但是,我得到了这个错误:java.lang.IllegalArgumentException:width*height>Integer.MAX\u VALUE

下面是我的代码片段(大致取自上面的链接):


ImageReader
基类(
JPEGImageReader
和所有其他ImageIO读取器实现的超类)的
getDestination
方法中存在已知错误/限制,该方法计算输入图像的宽度*高度,而不是您实际尝试读取的区域。。。这会阻止您阅读这些图像的哪怕是很小的一部分

代码如下所示,
宽度
高度
参数是输入的尺寸:

if ((long) width * height > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("width*height > Integer.MAX_VALUE!");
}
在我的大多数(TwelveMonkeys ImageIO库)
ImageReader
s中,我通过使用
getDestination
方法的不同实现来解决这个限制。但是对于
JPEGImageReader
我将实际解码委托给
com.sun….JPEGImageReader
,它使用原始方法,并导致此异常


通过使用
readgraster
方法而不是
read
(因为它不使用
getDestination
方法)可以解决此问题,但它需要额外的工作,我还没有可能对此进行测试。

ImageReader
基类的
getDestination
方法中有一个已知的错误/限制(
JPEGImageReader
和所有其他ImageIO阅读器实现的超类),该方法计算输入图像的宽度*高度,而不是你真正想要阅读的区域。。。这会阻止您阅读这些图像的哪怕是很小的一部分

代码如下所示,
宽度
高度
参数是输入的尺寸:

if ((long) width * height > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("width*height > Integer.MAX_VALUE!");
}
在我的大多数(TwelveMonkeys ImageIO库)
ImageReader
s中,我通过使用
getDestination
方法的不同实现来解决这个限制。但是对于
JPEGImageReader
我将实际解码委托给
com.sun….JPEGImageReader
,它使用原始方法,并导致此异常



通过使用
readgraster
方法而不是
read
(因为它不使用
getDestination
方法)可以解决这个问题,但是它需要额外的工作,我还没有可能测试这个问题。

在哪里发生异常?我不确定错误的来源是什么,但它建议您需要使用double。请提供stacktrace,并指出错误发生在哪一行。我将猜测
ImageIO.createImageInputStream
使用超过最大整数大小的宽度和高度进行计算。错误发生在image=r.read(0,param);我已经编辑了帖子以包含输出。@Samarth为了测试目的,您是否能够发布指向如此巨大图像的链接?异常发生在哪里?我不确定错误的来源,但它建议您需要使用double。请提供stacktrace,并指出错误发生在哪一行。我将猜测
ImageIO.createImageInputStream
使用超过最大整数大小的宽度和高度进行计算。错误发生在image=r.read(0,param);我已经编辑了这篇文章以包含输出。@Samarth为了测试目的,你能发布到如此巨大图像的链接吗?我正在使用jpeg进行测试(我发布链接是为了回应你上面的评论)。我实际上需要将它用于tiff文件。当我用tiff尝试相同的代码时,我得到了以下错误:
线程“main”java.util.NoSuchElementException中的异常,在
ImageReader=readers.next()行。在此之前,我检查以确保TwelveMonkeys
TIFFImageReader
已注册为tiff阅读器,因此这不是问题所在。这是否表明我的tiff图像不符合要求?如果您100%确定注册了
tiff图像阅读器
,则表明您的文件不是tiff文件(检测逻辑非常简单,只检查前4个字节)。也许它是一个BigTIFF?我想它可能是由arcGIS生成的,所以它可能是一个geotiff。如果你想试试,这里有一个指向tiff文件的链接:@Samarth,正如我所想,这个文件是一个。TwelveMonkeys
TIFFImageReader
当前不支持BigTIFF。不过,将来可能会这样。:-)我正在使用jpeg进行测试(我发布了链接以回应您的上述评论)。我实际上需要将它用于tiff文件。当我用tiff尝试相同的代码时,我得到了以下错误:
线程“main”java.util.NoSuchElementException中的异常,在
ImageReader=readers.next()行。在此之前,我检查以确保TwelveMonkeys
TIFFImageReader
已注册为tiff阅读器,因此这不是问题所在。这是否表明我的tiff图像不符合要求?如果您100%确定注册了
tiff图像阅读器
,则表明您的文件不是tiff文件(检测逻辑非常简单,只检查前4个字节)。也许它是一个BigTIFF?我想它可能是由arcGIS生成的,所以它可能是一个geotiff。如果你想试试,这里有一个指向tiff文件的链接:@Samarth,正如我所想,这个文件是一个。TwelveMonkeys
TIFFImageReader
当前不支持BigTIFF。不过,将来可能会这样。:-)
if ((long) width * height > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("width*height > Integer.MAX_VALUE!");
}