发现问题
在使用java原生的API进行图像处理的时候,将图片读入BufferedImage中进行操作,非常容易出现下面的错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
Coordinate out of bounds!
原理(风格)
操作像素时,非常容易范一个错误,那就是行和列的顺序不对。BufferedImage中操作像素的API和OpenCV中正好是反着的。函数声明如下:(这里使用setRGB函数举例)
看到文档中对于参数的描述,x指的的像素的横坐标,y指的的像素的纵坐标!!!,画张图吧
发现错误
当我们去遍历像素点时,按照常规逻辑,我们肯定是先遍历行,再遍历列。对应于指针i,j。然后我们在getRGB的时候就自然而然的在方法参数里先放入i,再放入j,这么做你就错了!!!。
错误代码如下
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
img.getRGB(i, j);
}
}
原因
i代表的是行号,j代表的是列号,如下图
再对比一下之前的那张图,想一想,你就明白了
结论:行号i对应的是Y轴,列号j对应的是X轴,所以在调用API要先j后i。
正确代码
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
img.getRGB(j, i);
}
}