-2

私はこのforループを持っています:

y1 = 0; y2 = 3264; x1 = 0; x2 = 4928; uc = 1; vc = 1; scale = 1;

for (var y = y1; y < y2; y++) {
    for (var x = x1; x < x2; x++) {
        sumR = 0;
        sumG = 0;
        sumB = 0;
        i = 0;

        for (var v = -vc; v <= vc; v++) {
            for (var u = -uc; u <= uc; u++) {
                if (kernel[i] != 0) {
                    var tempX = x + u < 0 ? 0 : x + u;
                    var tempY = y + v < 0 ? 0 : y + v;
                    tempX = tempX >= width ? width - 1 : tempX;
                    tempY = tempY >= height ? height - 1 : tempY;

                    sumR += pixels.data[((tempY * (pixels.width*4)) + (tempX * 4)) + 0] * kernel[i];
                    sumG += pixels.data[((tempY * (pixels.width*4)) + (tempX * 4)) + 1] * kernel[i];
                    sumB += pixels.data[((tempY * (pixels.width*4)) + (tempX * 4)) + 2] * kernel[i];
                }
                i++;
            }
        }
        tempArray.push(sumR * scale, sumG * scale, sumB * scale, 255);
    }
    console.log(y + "|" + y2);
}

つまり、基本的には画像処理に関するもので、ループはエラーなしで y = 3115 で停止し、ループが計算されなかった後のすべてがそこで「クラッシュ」します。これがどのように起こるか考えていますか?メモリに問題がある可能性はありますか?

更新:私はこれを少し不明確にしたと思います:サイズ y2 = 1000 および x2 = 1000 の画像にこのアルゴリズムを使用すると、すべて正常に動作します。しかし、画像が大きくなると動作が停止するだけで、コンソールにエラーメッセージは表示されません!

4

2 に答える 2

0
  • uc + vc = 1;は無効なステートメントです。
  • ucどこにも定義されてvcいないようですが、
  • scaleどこにも定義されていません。

  • ここの2番目x1はおそらく次のようになりますx2:

    x1 = 0; x1 = 4928;
    //Should probably be:
    x1 = 0; x2 = 4928;
    

これは、「コードをデバッグする」に帰着します。

于 2012-11-28T08:35:42.217 に答える
0

さて、やっと問題が見つかりました。

この方法で配列を初期化しましたvar tempArray = [];。for ループの上で、次のステップは、この方法で初期化しようとしたことです。var tempArray = new Array(width * height * 4)

ブラウザはその位置で停止しただけで、for ループにも入りませんでした。したがって、配列は作成するには大きすぎると思います。

解決策: 現在、型指定された配列を使用していますが、すべてが機能しています:

var tempArray = new Uint8ClampedArray(width * height * 4);
于 2012-11-30T12:36:36.937 に答える