2013-04-23 61 views
0

我比较Java中的BufferedImage对象。我从一组图像中获得图像,并将其与同一组中的所有图像进行比较。但是,它会导致这种奇怪的错误,将图像与自身进行比较,并且对于其他图像,一切都很好。下面的代码:BufferedImage比较图像与自身抛出ArrayOutOfBoundsException

private boolean diagonalCompare() { 
    for(int i = 0, j = 0; i < w && j < h; i++, j++) { 
     if(bimg1.getRGB(i, j) != bimg2.getRGB(i, j)) { 
      return false; 
     } 
    } 
    for(int i = w, j = 0; i > -1 && j < h; i--, j++) { 
//-----------THIS IS THE LINE CAUSES THE ERROR---------------------------------\\ 
     if(bimg1.getRGB(i, j) != bimg2.getRGB(i, j)) { 
      return false; 
     } 
    } 
    return true; 
} 

这里的堆栈跟踪:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! 
at sun.awt.image.ByteInterleavedRaster.getDataElements(Unknown Source) 
at java.awt.image.BufferedImage.getRGB(Unknown Source) 
at com.oy.duplicator.SimpleComparator.diagonalCompare(SimpleComparator.java:144) 
at com.oy.duplicator.SimpleComparator.compareBufferedImage(SimpleComparator.java:78) 
at com.oy.duplicator.SimpleComparator.compare(SimpleComparator.java:44) 
at com.oy.duplicator.Main.main(Main.java:78) 

ArrayOutOfBoundsException?这是为什么?也许这是由读取相同文件引起的,但它在第一个for-loop中起作用。

回答

1

我怀疑这是因为在所有其他图像中,你永远无法执行第二个for循环。

第二个for循环应该是:

for(int i = w - 1, j = 0; i > -1 && j < h; i--, j++) { 

w - 1而不是w

否则,你就开始你的比较坐标(w, 0)和坐标将是唯一有效的0w - 1,这就是为什么你会得到例外。