按12像素间隔遍历图像生成二维数组出现下标越界如何解决
问题原因
- 二维数组下标和循环逻辑不匹配
你定义的二维数组是int[][] pixels = new int[height / 12][width / 12],第一维长度为height/12(对应Y方向的采样数),第二维长度为width/12(对应X方向的采样数)。
但你的循环外层i遍历的是X方向采样数(范围0~width/12-1),内层j遍历的是Y方向采样数(范围0~height/12-1),赋值时用pixels[i][j],当width/12 > height/12时,i的取值会超过第一维的最大索引,就会出现你遇到的数组越界错误。 - counterX、counterY计数逻辑冗余,还容易触发坐标越界
你从坐标1开始采样,直接丢失了(0,0)位置的像素,且当图片宽高不是12的倍数时,很容易取到超出图片范围的坐标。 - 黑色判断逻辑效率低
转十六进制字符串对比的方式性能远不如直接做位运算判断。
修复方案
直接通过循环下标计算采样坐标,去掉冗余的计数器逻辑,同时对齐数组下标即可:
int width = image.getWidth(); int height = image.getHeight(); // 计算采样数,如果需要保留不足12的边界像素可以改成 (height + 11)/12 和 (width + 11)/12 向上取整 int sampleY = height / 12; int sampleX = width / 12; int[][] pixels = new int[sampleY][sampleX]; for (int j = 0; j < sampleY; j++) { // 计算Y方向采样坐标,如果你确实需要从1开始偏移可以改为 j*12 + 1 int y = j * 12; for (int i = 0; i < sampleX; i++) { // 计算X方向采样坐标,如果你确实需要从1开始偏移可以改为 i*12 + 1 int x = i * 12; int rgb = image.getRGB(x, y); // 直接判断是否为纯黑,不需要转字符串 pixels[j][i] = (rgb == 0xff000000) ? 1 : 0; } } return pixels;
内容的提问来源于stack exchange,提问作者Mannual
相关产品推荐
相关产品推荐

