0

キャンバスから getImageData() を実行すると、クランプされた配列である Data サブオブジェクトを含む ImageData オブジェクトが取得されます。取得したすべてのピクセルが白かどうか (透明でないかどうか) を確認したい。つまり、データ オブジェクトのすべての値が 255 に等しいかどうかを確認したいということです。明らかなコードは次のようになります。

if (data.every(function(value) {return value == 255})) {
    //Do something
    }

ただし、次の最小限のコードが示すように、何らかの理由でクランプされた配列では機能しません。

var DATA = new Uint8ClampedArray(3);
//var DATA = new Array

DATA[0] = 255
DATA[1] = 255
DATA[2] = 255
DATA[3] = 255

alert(DATA.every(function(value) {return value == 255}))

解決策はありますか?ありがとう!

4

2 に答える 2

3

次の方法で Array メソッドを使用できます.call()

alert([].every.call(DATA, function(v) { return v === 255; }));

.every()Uint8ClampedArray プロトタイプには存在しないため、記述したとおりには機能しません。

于 2012-08-17T16:28:37.227 に答える
2

プロトタイプから取得できる関数をUint8ClampedArray使用して、 のプロトタイプを拡張できます。その後、コードは正常に動作します。every()Array

Uint8ClampedArray.prototype.every = Array.prototype.every;

これが最も簡単な方法だと思いますが、for ... inループが壊れることに注意してください(とにかく配列を反復処理するために使用すべきではありません...)。

于 2012-08-17T16:29:02.167 に答える