首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用Raster.setRect()时的ArrayIndexOutOfBoundsException

调用Raster.setRect()时的ArrayIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2012-03-07 21:22:29
回答 1查看 1.9K关注 0票数 1

我写了一个读取图像的方法。我循环遍历图像文件列表并读取它们。在一些迭代之后,当调用Raster.setRect(栅格)方法时出现ArrayIndexOutOfBoundsException。图像的尺寸和边界都很好-请参阅stacktrace。

代码语言:javascript
复制
public static BufferedImage readImage(File imageFile) {

    // Find a suitable ImageReader
    Iterator<ImageReader> readers = ImageIO.getImageReadersBySuffix("jpg");
    ImageReader reader = null;
    while (readers.hasNext()) {
        reader = (ImageReader) readers.next();
        if (reader.canReadRaster()) {
            break;
        }
    }

    // Stream the image file (the original CMYK image)
    ImageInputStream input = null;
    try {
        input = ImageIO.createImageInputStream(imageFile);
    } catch (IOException e) {
        logger.error("Error creating InputStream on File {}", imageFile
                .getName());
        e.printStackTrace();
    }
    reader.setInput(input);

    // Read the image raster
    Raster raster = null;
    try {
        raster = reader.readRaster(0, null);
    } catch (IOException e) {
        logger
                .error("Error reading Raster of file {}", imageFile
                        .getName());
        e.printStackTrace();
    }

    // Create a new RGB image
    BufferedImage bi = new BufferedImage(raster.getWidth(), raster
            .getHeight(), BufferedImage.TYPE_INT_RGB);

    // Fill the new image with the old raster
    logger.debug("Height {} and width {} of original raster", raster
            .getHeight(), raster.getWidth());
    logger.debug("Height {} and width {} of new raster", bi.getRaster()
            .getHeight(), bi.getRaster().getWidth());
    logger.debug("NumBands original raster {}", bi.getRaster().getBounds());
    logger.debug("NumBands new raster {}", bi.getRaster().getBounds());
    bi.getRaster().setRect(raster);

    // Close and flush the reader
    try {
        input.close();
    } catch (IOException e) {
        logger.error("Error closing the reader for file {}", imageFile
                .getName());
        e.printStackTrace();
    }

    return bi;
}

下面是堆栈跟踪:

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 310
at java.awt.image.SinglePixelPackedSampleModel.setPixels(SinglePixelPackedSampleModel.java:689)
at java.awt.image.WritableRaster.setPixels(WritableRaster.java:565)
at java.awt.image.WritableRaster.setRect(WritableRaster.java:467)
at java.awt.image.WritableRaster.setRect(WritableRaster.java:403)
at .. .utils.ImageUtils.readImage(ImageUtils.java:228)
at .. .image.scripts.ImageMatchingScript.main(ImageMatchingScript.java:86)

所有图像都具有相同的尺寸371x310

下面是我打印的调试信息:

代码语言:javascript
复制
13:53:17.065 [main] DEBUG .. .ImageUtils - Height 371 and width 310 of original raster
13:53:17.065 [main] DEBUG .. .ImageUtils - Height 371 and width 310 of new raster
13:53:17.065 [main] DEBUG .. .ImageUtils - NumBands original raster java.awt.Rectangle[x=0,y=0,width=310,height=371]
13:53:17.065 [main] DEBUG .. .ImageUtils - NumBands new raster java.awt.Rectangle[x=0,y=0,width=310,height=371]

文档说: ArrayIndexOutOfBoundsException -如果坐标不在边界内,或者如果fArray太小而无法容纳输入。

对我来说,尺寸/边界似乎很好,也许这是fArray的问题?

EN

回答 1

Stack Overflow用户

发布于 2012-03-07 21:50:07

我想问题不在于图像的尺寸,而在于光栅中的波段数。您可以创建自己的BufferedImage.TYPE_INT_RGB。可能失败的图像是带有alpha通道的PNG,在这种情况下,光栅有一个额外的波段。

我想知道为什么您要以这种复杂的方式进行加载,为什么不直接使用ImageIo.read(InputStream)呢?这将给你一个BufferedImage,不需要自己转换它。

编辑:尝试此方法读取并转换为RGB:

代码语言:javascript
复制
InputStream input = null;
try {
input = new FileInputStream(...); // whatever your source is
    BufferedImage rawImage = ImageIO.read(input);
    if (rawImage == null)
        return null;
    BufferedImage rgbImage = new BufferedImage(rawImage.getWidth(null), rawImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
    Graphics g = rgbImage.createGraphics();
    // if rawImage contains alpha, consider filling the rgbImage with a default BG color here
    g.drawImage(rawImage, 0, 0, null);
    g.dispose();
    rawImage.flush();
    return rgbImage;
} catch (Exception e) {
// handle error
    return null;
} finally {
    // close input if open
    if (input != null) {
        try {
            input.close();
        } catch (IOException e) {}
    }
}

只是把代码拼凑在一起,可能包含打字错误。这样你就可以得到RGB图像,而不管源文件是什么,甚至无需考虑源图像属性。

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

https://stackoverflow.com/questions/9602303

复制
相关文章

相似问题

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