0

我正在尝试打印每个像素的值,但它在p = 300. 之前p = 300,打印所有像素。

orignal.getHeight() = 344;orignal.getWidth() = 300;

BufferedImage binarized = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());
int p, q;

System.out.println(original.getHeight() + "," + original.getWidth());

for(p=0;p<original.getHeight();p++)
{
    for(q = 0; q < original.getWidth(); q++)
    {
        //System.out.println("goint to get pixel"+"("+p+","+q+")");
        int Pixel = binarized.getRGB(p, q);
    }
}

错误信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
    at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
    at java.awt.image.BufferedImage.getRGB(BufferedImage.java:888)
    at Binarization.binarize(Binarization.java:137)
        at Binarization.main(Binarization.java:20)

这是某种内存分配问题吗?

4

2 回答 2

7

不,这意味着您的逻辑有误。

您尝试通过索引访问数组元素,该索引大于数组大小

尝试更改数组检索的逻辑:

 int Pixel=binarized.getRGB(q,p);

这是有效的,因为该方法需要:getRGB(int width,int height),但您为其提供了高度、宽度

于 2013-06-08T09:01:48.493 回答
3

查看文档BufferedImage.getRGB

public int getRGB(int x, int y)

请注意,该x值是第一个参数 -应该在 [0, width) 范围内。该y值是第二个参数——它应该在 [0, height) 范围内。你把它们弄错了。诚然,我对例外并不友好感到有些失望。

如果您也在循环中使用x和变量会更清楚:y

for (int y = 0; y < original.getHeight(); y++)
{                   
    for (int x = 0; x < original.getWidth(); x++)
    {                   
        int pixel = binarized.getRGB(x, y);
        // Use pixel
    }                   
} 

(还要注意我是如何声明的x以及y在循环本身中;事先声明它们是没有意义的。我还添加了空格以提高可读性。)

于 2013-06-08T09:07:33.527 回答