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遍之後完全灰度化圖像。 在此先感謝!