0

次のパラメータに基づいて 2 つの B&W 画像をマージしようとしています。

新しく作成された配列は、2 つの画像の幅と高さのうち最大のものを独自のものとして使用します。配列内の特定の位置にある int には、グレー スケール量を表す数値が含まれます。新しい 2D 配列は、次の条件に基づいて 2 つの画像をマージします。

  • 位置が両方の配列に存在する場合、結果配列の値は配列 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;
}
4

1 に答える 1

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 の範囲外に到達しようとしています。私の例では、 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.lengthandの種類のステートメントをand またはandy <= a[x].lengthに変更する必要がありますx < a.lengthy < a[x].lengthx <= a.length - 1y <= a[x].length - 1

于 2013-07-23T18:13:48.593 に答える