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) の範囲内にある必要があります。値は 2 番目のパラメーターです。yこれは [0, height) の範囲内にある必要があります。あなたはそれらを間違った方法で手に入れました。確かに、例外が友好的ではないことに少しがっかりしています。

ループ内でxand変数も使用すると、より明確になります。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
    }                   
} 

(また、ループ自体でxandを宣言した方法にも注意してくださいy。事前に宣言しても意味がありません。読みやすくするために空白も追加しました。)

于 2013-06-08T09:07:33.527 に答える