【问题标题】:Making a blur algorithm work with canvas image data?使模糊算法与画布图像数据一起工作?
【发布时间】:2012-01-02 14:30:56
【问题描述】:

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

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() 生成。问题是画布中的数组是一维的,算法需要一个二维的,因为“kx”和“ky”是与当前像素的距离,在二维数组中,您只需更改其中的一个索引为了在网格上向左或向右移动,但在一维数组中(试图表示二维。一)你不能这样做。

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

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

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

附:我忘了说我试图一次模糊一个通道的图像,就像这样:

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++;
}

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

【问题讨论】:

    标签: javascript algorithm canvas blur


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多