0
我试图实现一个简单的模糊算法,平均来自3x3区域周围像素的颜色。模糊算法画布不工作JS
我环像素阵列throught,在4增量然后,我有一个函数,它接受6个参数:
r -> red value [0-255] int
g -> green value [0-255] int
b -> blue value [0-255] int
a -> alpha value(opacity) [0-255] int
d -> pixel array [r0,g0,b0,a0,r1,g1,b1,a1,r2... etc] array
i -> current index
我生成4新值,新的红色,绿色新,新的蓝色和新alpha并将它们返回到一个对象中。
这是整个代码:
//canvas setup
var width = 400;
var height = 400;
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
//create image
var img = new Image();
img.src = 'images/input.jpg';
var pixels;
img.onload = function(){
ctx.drawImage(img, 0, 0);
pixels = ctx.getImageData(0, 0, width, height);
}
function action(pixels, callback){
var newData = ctx.createImageData(width, height);
for(var i = 0; i < pixels.data.length; i+=4){
var r = pixels.data[i];
var g = pixels.data[i+1];
var b = pixels.data[i+2];
var a = pixels.data[i+3];
var channels = callback(r, g, b, a, pixels.data, i);
newData.data[i] = channels.r;
newData.data[i+1] = channels.g;
newData.data[i+2] = channels.b;
newData.data[i+3] = channels.a;
pixels.data[i] = channels.r;
pixels.data[i+1] = channels.g;
pixels.data[i+2] = channels.b;
pixels.data[i+3] = channels.a;
}
ctx.putImageData(newData, 0, 0);
}
function run(){
action(pixels, function(r,g,b,a,d,i){
var nr = (r
+ (d[i - 4] || r)
+ (d[i + 4] || r)
+ (d[i - 4 * width] || r)
+ (d[i + 4 * width] || r)
+ (d[i - 4 * width - 4] || r)
+ (d[i + 4 * width + 4] || r)
+ (d[i - 4 * width + 4] || r)
+ (d[i + 4 * width - 4] || r)
)/9;
var ng = (g
+ (d[i - 4] || g)
+ (d[i + 4] || g)
+ (d[i - 4 * width] || g)
+ (d[i + 4 * width] || g)
+ (d[i - 4 * width - 4] || g)
+ (d[i + 4 * width + 4] || g)
+ (d[i - 4 * width + 4] || g)
+ (d[i + 4 * width - 4] || g)
)/9;
var nb = (b
+ (d[i - 4] || b)
+ (d[i + 4] || b)
+ (d[i - 4 * width] || b)
+ (d[i + 4 * width] || b)
+ (d[i - 4 * width - 4] || b)
+ (d[i + 4 * width + 4] || b)
+ (d[i - 4 * width + 4] || b)
+ (d[i + 4 * width - 4] || b)
)/9;
return {r: nr, g: ng, b: nb, a: 255};
});
}
正如你可以看到,周围的像素值是硬编码。 你可以在这里进行测试:
https://codepen.io/tyrellrummage/pen/Ewgzzx
如果运行按钮不执行任何操作,重新加载,然后再试一次(与codepen跨域一些问题)。尝试多次点击运行按钮以增加算法的通过次数。
你会注意到它会在2/3遍之后完全灰度化图像。 在此先感谢!