計算機科学のブログ

マルチメディアを学ぶ 画像、ぼかし、Canvas、データ、配列、ピクセル、色、平均

ハンズオンJavaScript (あんどうやすし(著)、オライリー・ジャパン)の15章(マルチメディアを学ぶ)、15.9(練習問題)の15-3の解答を求めてみる。

コード

let img_js = document.querySelector('#jslog'),
    canvas_js = document.querySelector('#jscanvas'),
    ctx = canvas_js.getContext('2d');

ctx.drawImage(img_js, 0, 0);

let image_data_before = ctx.getImageData(0, 0, 200, 200),
    image_data_after = ctx.getImageData(0, 0, 200, 200),
    data_before = image_data_before.data;

for (let y = 0; y < 200; y++) {
    if (y === 0 || y === 199) {
        continue;
    }
    for (let x = 0; x < 200; x++) {
        let base_y = 200 * y * 4,
            base_x = x * 4,
            base = base_y + base_x;
        image_data_after.data[base] =
            Math.floor(
                (data_before[base_y - 200 * 4] +
                    data_before[base - 4] +
                    data_before[base] +
                    data_before[base + 4] +
                    data_before[base_y + 200 * 4]) / 5
            );
        image_data_after.data[base + 1] =
            Math.floor(
                (data_before[base_y - 200 * 4 + 1] +
                    data_before[base - 4 + 1] +
                    data_before[base + 1] +
                    data_before[base + 4 + 1] +
                    data_before[base_y + 200 * 4 + 1]) / 5
            );
        image_data_after.data[base + 2] =
            Math.floor(
                (data_before[base_y - 200 * 4 + 2] +
                    data_before[base - 4 + 2] +
                    data_before[base + 2] +
                    data_before[base + 4 + 2] +
                    data_before[base_y + 200 * 4 + 2]) / 5
            );
    }
}

ctx.putImageData(image_data_after, 0, 0);

ぼかした画像。