BufferedImage.getRGB 中的坐标超出范围

Posted

技术标签:

【中文标题】BufferedImage.getRGB 中的坐标超出范围【英文标题】:Coordinate out of bounds in BufferedImage.getRGB 【发布时间】:2018-05-16 00:27:42 【问题描述】:

我正在尝试通过此方法将此 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; 

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

“坐标超出范围! 在 sun.awt.image.ByteInterleavedRaster.getDataElements(未知来源) 在 java.awt.image.BufferedImage.getRGB(Unknown Source)"

【问题讨论】:

循环变量分别使用yx 而不是ij。然后阅读documentation for getRGB。问题应该很清楚了。 【参考方案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(在高度上迭代),所以最好将它们命名为xy。这将使错误更容易被发现,尤其是在查阅文档时。

【讨论】:

【参考方案2】:

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

代替:

【讨论】:

@JamesB '克服 它在已经超出范围的循环中添加另一个循环迭代。

以上是关于BufferedImage.getRGB 中的坐标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

e671. 在缓冲图像中存取像素

openGL中的坐标系

OpenGL中的坐标系

已知两个坐标系中的两个对应点,怎么求两个坐标系的转换关系

将屏幕坐标中的 NSPoint 转换为窗口坐标

Unity中的全局坐标系和局部坐标系