在BufferedImage.getRGB

时间:2017-12-01 20:42:43

标签: java indexoutofboundsexception bufferedimage

我试图通过此方法将此PNG图像从BufferedImage转换为双数组。

public double[][] bufferedToArray(File pngImage)
{       
    double[][] imageMatrix= null;
    try {

        final BufferedImage image = ImageIO.read(pngImage);
        int height= image.getHeight();
        int width= image.getWidth();
        imageMatrix= new double[height][width];

        System.out.println("Matriz Máximo i: " + imageMatrix.length +
                "Matriz Máximo j: " + imageMatrix[0].length );

        for(int i=0;i<height;i++){
            for(int j=0;j<width;j++){

                //System.out.println("i atual: "+i+" j atual: "+j);
                imageMatrix[i][j] = image.getRGB(i, j); //The error is in this line.
                //System.out.println("matrizImagem["+i+"]["+j+"] Inserido");

            }           
        }                       

    } catch (IOException e) {       
        e.printStackTrace();
    }
    return imageMatrix; 
}

即使我将数组定义为图像高度和宽度的确切大小,当它几乎完成循环时,我得到了边界的误差。我不知道为什么。

&#34;协调出界!     at sun.awt.image.ByteInterleavedRaster.getDataElements(Unknown Source)     at java.awt.image.BufferedImage.getRGB(Unknown Source)&#34;

2 个答案:

答案 0 :(得分:1)

您的代码中的问题只是混淆了ij的含义,以及getRGB(x, y)所期望的参数。您的代码将(意外地)仅适用于方形图像。

更改行:

imageMatrix[i][j] = image.getRGB(i, j); //The error is in this line.

为:

imageMatrix[i][j] = image.getRGB(j, i);

将解决问题。

然而(正如VGR在他的评论中指出的那样),使用更有意义的变量名称的良好做法。由于j是您的X坐标(在宽度上迭代),i是您的Y(在高度上迭代),因此最好将它们命名为x和{ {1}}。这将使错误更容易被发现,特别是在查阅文档时。

答案 1 :(得分:-2)

我想错误是你的I和j变量变得比高度和宽度都大。尝试将for循环的条件更改为:

我&lt; =身高 J&lt; = width

而不是:

我&lt;高度 J&lt; widtb