このコードを検討してください:
var deSaturated = deSaturate(greyscaleCtx.getImageData(0, 0, canvasWidth, canvasHeight));
imageData は getImageData キャンバス関数から取得されます。
function deSaturate (imageData) {
var theData = imageData.data;
var dataLength = theData.length;
var i = dataLength-1;
var lightLevel;
// Iterate through each pixel, desaturating it
while ( i >= 0) {
// To find the desaturated value, average the brightness of the red, green, and blue values
theData[i] = theData[i+1] = theData[i+2] = (theData[i] + theData[i + 1] + theData[i + 2]) / 3;
// Fully opaque
theData[i+3] = 255;
// returning an average intensity of all pixels. Used for calibrating sensitivity based on room light level.
lightLevel += theData[i]; //combining the light level in the samefunction
i -= 4;
}
imageData.data = theData; //bring back theData into imageData.data - do I really need this?
var r = [lightLevel/dataLength,imageData]
return r;
}
このコードの作成と最適化中に、js が "theData" 変数などをどのように扱っているかがよくわからないことがわかりました。imageData.data を参照する簡単な方法で作業しています。この場合、最終的に次のコードは必要ありません。
imageData.data = theData
しかし、その後、パフォーマンスの低下 (大量の DOM I/O) を支払うことになりますか?
またはtheData = imageData.data
、元の配列 (Uint8ClampedArray として表される) を実際にコピーしてから、変更されたデータを に再割り当てする必要がありimageData.data
ます。
これは基本的な JavaScript だと思いますが、MDN やその他の開発者リソースで矛盾したコード例を見つけたので、これを正しく理解したいと思います。
助けてくれてありがとう!