首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图从java中的非常大的图像文件中读取区域时出错

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

Stack Overflow用户
提问于 2017-04-23 05:55:55
回答 1查看 755关注 0票数 1

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

但是,我得到了以下错误: java.lang.IllegalArgumentException: width*height > Integer.MAX_VALUE!

下面是我的代码片段(或多或少完全取自上面的链接):

代码语言:javascript
复制
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);
        }

我的理解是,为param指定矩形sourceRegion将使ImageReader只读取图像的那一小块,因此我不明白是什么导致了错误。任何帮助都将不胜感激。如果有帮助的话,我正在使用TwelveMonkeys ImageIO插件。

这是输出:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2017-04-24 08:40:49

getDestination基类的ImageReader方法( JPEGImageReader和所有其他ImageIO读取器实现的超类)中有一个已知的bug/限制,它计算输入图像的宽度*高度,而不是实际试图读取的区域.这使得你无法阅读这些图像的很小部分。

代码如下所示,widthheight参数是输入的维度:

代码语言:javascript
复制
if ((long) width * height > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("width*height > Integer.MAX_VALUE!");
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43567913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档