javascript - 使模糊算法适用于 Canvas 图像数据?

标签 javascript algorithm canvas blur

我有以下简单的模糊算法:

for (y = 0; y < height; ++y) {
    for (x = 0; x < width; ++x) {
        total = 0
            for (ky = -radius; ky <= radius; ++ky)
                for (kx = -radius; kx <= radius; ++kx)
                    total += source(x + kx, y + ky)
            dest(x, y) = total / (radius * 2 + 1) ^ 2  
        }
    }

我需要使用一个数组来完成这项工作,该数组由 Canvas 使用 getImageData() 生成。问题是来自 canvas 的数组是一维的,算法需要一个二维的,因为“kx”和“ky”是与当前像素的距离,在二维数组中你只需更改其中的一个索引为了在网格上向左或向右移动,但在一维数组中(它试图表示一个二维数组)你不能这样做。

你怎么看,我应该如何解决这个问题?在我看来,整个问题都在这里:

total += source(x + kx, y + ky)

这条线需要从一维数组中获取正确的像素,它应该可以正常工作。

附言我忘了说我正在尝试一次模糊一个 channel 的图像,如下所示:

for (var i=0; i<imgData.data.length; i+=4) {
    red[index] = imgData.data[i];
    green[index] = imgData.data[i+1];
    blue[index] = imgData.data[i+2];

    index++;
}

我将每个数组(红色、绿色和蓝色)分别传递给算法。

最佳答案

为了访问具有二维坐标的一维数组,您有以下公式:

var pixel = pixels[ ( ( y * width ) + x ) * 4 ];

添加 * 4 是为了说明 r、g、b、a 值。 xResolution 是图像的宽度。

所以 source() 将是:

function source( imageArray, x, y, imageWidth )
{
    var pos = ( ( y * imageWidth ) + x ) * 4;
    var val =
    {
        r : imageArray[ pos ],
        g : imageArray[ pos + 1 ],
        b : imageArray[ pos + 2 ],
        a : imageArray[ pos + 3 ]
    };

    return val;
}

关于javascript - 使模糊算法适用于 Canvas 图像数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702020/

相关文章:

java - Shenoy 和 Shafer 的推理算法

javascript - globalCompositeOperation 在背景上绘制白色

javascript - 通过 javascript 检索网页的实际 DOM/css 状态

javascript - 如何在javascript中计算闰年的两个日期之间的日期差?

算法:非常稀疏的位数组的数量巨大,要使用哪种编码

algorithm - 遍历具有多个未知权重边的图形的最快方法

javascript - 使用canvas html5创建图像像素的二维数组

javascript - 您如何转换音频进度条码以使其具有渐变?

javascript - Rails - 为一个 Controller 生成两个 javascript 文件,因此 js 函数执行两次

javascript - ExtJs 多次 Ajax 调用