使用2D阵列作为像素合并2个图像

时间:2013-07-23 17:07:59

标签: java arrays image merge indexoutofboundsexception

我正在尝试根据以下参数合并两个B& W图像。

新创建的数组使用两个图像的宽度和高度中最大的一个。数组中特定点的int包含一个表示灰度值的数字。新的2D阵列将根据以下条件合并两个图像。

  • 如果两个数组中都存在该位置,则结果数组中的值是数组a和b中的值的平均值。
  • 如果位置仅存在于数组a中,则结果数组中的值是数组a中的值
  • 如果位置仅存在于数组b中,则结果数组中的值为数组b中的值
  • 如果位置不在两个数组中,则在结果数组中的该位置指定值127。

这是我的代码。它不会因为某种原因返回arrayIndexOutOfBounds: 167而运行。如果有人能看一下,我会很感激。

public static int[][] merge(int[][] a, int[][] b)
{
    int biggerx = 0;
    int biggery = 0;
    if (a[0].length > b[0].length) {
        biggery = a[0].length;
    }
    else {
        biggery = b[0].length;
    }
    if (a.length > b.length) {
        biggerx = a.length;
    }
    else {
        biggerx = b.length;
    }
    int[][] merged = new int[biggerx][biggery];
    for (int x = 0; x < merged.length; x++) {
        for (int y = 0; y < merged[x].length; y++) {
            if (x <= a.length && y <= a[x].length && x > b.length && y > b[x].length) {
                merged[x][y] = a[x][y];
            }
            else if (x <= b.length && y <= b[x].length && x > a.length && y > a[x].length) {
                merged[x][y] = b[x][y];
            }
            else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) {
                merged[x][y] = ((a[x][y] + b[x][y]) /2);
            }
            else {
                merged[x][y] = 127;
            }
        }
    }
    return merged;
}

1 个答案:

答案 0 :(得分:0)

else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) {
    merged[x][y] = ((a[x][y] + b[x][y]) /2); // <= problematic line
}

在这一行中,你试图达到一个超出界限的点。在我的示例中,我将a设置为(10, 10),将b设置为(5, 20)。它在x = 0, y = 10时崩溃了。现在,正如您所看到的,a[0][10]已超出范围。

这是我的试用代码及其输出:

else if (x <= b.length && y <= b[x].length && x <= a.length && y <= a[x].length) {
    System.out.println("x = " + x + " y = " + y);
    System.out.println("merged.length = " + merged.length);
    System.out.println("merged[0].length = " + merged[0].length);
    System.out.println("a.length = " + a.length);
    System.out.println("a[0].length = " + a[0].length);
    System.out.println("b.length = " + b.length);
    System.out.println("b[0].length = " + b[0].length);
    System.out.println();
    System.out.println();
    merged[x][y] = ((a[x][y] + b[x][y]) /2);
}

输出:

x = 0 y = 10

merged.length = 10

merged[0].length = 20

a.length = 10

a[0].length = 10

b.length = 5

b[0].length = 20

编辑:刚才注意到我提出的解决方案不适合你。

EDIT2:x <= a.lengthy <= a[x].length种语句需要更改为x < a.lengthy < a[x].lengthx <= a.length - 1y <= a[x].length - 1

相关问题