javascriptから画像にぼかし画像処理を行うために、以下のスクリプトが見つかりました。私はサンプルを複製しますが、私は、このスクリプトの小さな一部が正常に動作可能性がどのように理解していなかった、私はスクリプトが表示されます:このGaussian Blur javascriptアルゴリズムはどのように機能しますか?
var gaussianBlur = function() {
var data = ctx.getImageData(0,0,canvas.width,canvas.height);
var px = data.data;
var tmpPx = new Uint8ClampedArray(px.length);
tmpPx.set(px);
for (var i = 0, len= px.length; i < len; i++) {
if (i % 4 === 3) {continue;}
px[i] = (tmpPx[i]
+ (tmpPx[i - 4] || tmpPx[i])
+ (tmpPx[i + 4] || tmpPx[i])
+ (tmpPx[i - 4 * data.width] || tmpPx[i])
+ (tmpPx[i + 4 * data.width] || tmpPx[i])
+ (tmpPx[i - 4 * data.width - 4] || tmpPx[i])
+ (tmpPx[i + 4 * data.width + 4] || tmpPx[i])
+ (tmpPx[i + 4 * data.width - 4] || tmpPx[i])
+ (tmpPx[i - 4 * data.width + 4] || tmpPx[i])
)/9;
};
// data.data = px;
ctx.putImageData(data,0,0);
delete tmpPx;
btnBlur.removeAttribute('disabled');
btnBlur.textContent = 'Blur'; }
この関数(gaussianBlur()
)HTMLボタンにトリガされるので、クリックされた場合のそれをぼかすために画像を処理し、このプロセスはボタンのクリック数に応じて繰り返されます。私が理解できないコードの部分は、forループが終了し、すべての演算がpx
変数に保存されていますが、次の行コードctx.putImageData(data,0,0);
に保存されています。このdata
変数は新しい変更変数px
を受け取りません。だから、data
変数がdata
コンポーネント(gaussianBlur
の最初の行に示されているようにの機能)に変更されていないと、キャンバスが画像がぼやけてレンダリングされる可能性があります。
私の意見では、このコードを理解するために、私はこのループコードの後にdata.data = px;
を置きます。新しいpx
はdata.data
という変数に設定されると言っています。このラインコードがないと、アルゴリズムが働きます。だから私はなぜdata.data
が新しいpx
の値で設定されていないにもかかわらず、うまくいかないと混乱しています。それを理解するのを助けてください。何が起こっている事前
'px' *は' data.data'参照と同じ 'Uint8ClampedArray'を参照しています。 javascriptの非[プリミティブ型](https://developer.mozilla.org/en-US/docs/Glossary/Primitive)はすべて参照型です。 –