gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:10 24 4
gpt4 key购买 nike

我需要读取一个非常大的图像文件(56000 px X 49000 px)。我需要以小矩形 block 的形式读取它,所以我尝试遵循这个示例:Read region from very large image file in Java

但是,我收到此错误:java.lang.IllegalArgumentException: width*height > Integer.MAX_VALUE!

我的代码片段如下(或多或少准确地取自上面的链接):

ImageInputStream stream = null;
try {
stream = ImageIO.createImageInputStream(new File(this.inFile)); // File or input stream
} catch (Exception ex) {
Logger.getLogger(CreateTrainingSetFromImage.class.getName()).log(Level.SEVERE, null, ex);
}
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);

ImageReader r = readers.next();
System.out.println("Using reader: " + r);
r.setInput(stream);
try {
System.out.println("Height = " + r.getHeight(0));
System.out.println("Width = " + r.getWidth(0));
} catch (IOException ex) {
Logger.getLogger(CreateTrainingSetFromImage.class.getName()).log(Level.SEVERE, null, ex);
}

ImageReadParam param = r.getDefaultReadParam();
Rectangle sourceRegion = new Rectangle(0, 0, 200, 200);
param.setSourceRegion(sourceRegion); // Set region

BufferedImage image = null;
try {
image = r.read(0, param); // Will read only the region specified
System.out.println("Read file " + this.inFile);
System.out.println("Width = " + image.getWidth());
System.out.println("Height = " + image.getHeight());
} catch (Exception ex) {
Logger.getLogger(CreateTrainingSetFromImage.class.getName()).log(Level.SEVERE, null, ex);
}

我的理解是,为参数指定 Rectangle sourceRegion 会使 ImageReader 只读取图像的一小部分,所以我不明白是什么导致了错误。任何帮助将非常感激。如果有帮助,我正在使用 TwelveMonkeys ImageIO 插件。

这是输出:

Using reader: com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReader@5437dd04
Height = 49429
Width = 56281
Apr 23, 2017 11:57:17 AM createtrainingsetfromimage.CreateTrainingSetFromImage test
SEVERE: null
java.lang.IllegalArgumentException: width*height > Integer.MAX_VALUE!
at javax.imageio.ImageReader.getDestination(ImageReader.java:2840)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1066)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1034)
at com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:382)
at createtrainingsetfromimage.CreateTrainingSetFromImage.test(CreateTrainingSetFromImage.java:102)
at createtrainingsetfromimage.CreateTrainingSetFromImage.createTrainingSet(CreateTrainingSetFromImage.java:168)
at createtrainingsetfromimage.CreateTrainingSetFromImage.main(CreateTrainingSetFromImage.java:46)

最佳答案

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

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

if ((long) width * height > Integer.MAX_VALUE) {
throw new IllegalArgumentException("width*height > Integer.MAX_VALUE!");
}

在我的大多数(TwelveMonkeys ImageIO 库)ImageReader 中,我通过使用 getDestination 方法的不同实现来解决此限制。但对于JPEGImageReader,我将实际解码委托(delegate)给com.sun....JPEGImageReader,它使用原始方法,并导致此异常。

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

关于java - 尝试从 java 中非常大的图像文件读取区域时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43567913/

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