Kernel = function (w, h, a) { this.w = w this.h = h this.a = a } Kernel.prototype.normalize = function(){ var n = 0; for (var i = 0; i < this.a.length; i++) n += this.a[i]; for (var i = 0; i < this.a.length; i++) this.a[i] /= n; return this } ConvolveOp = function (kernel, edge_zero_fill, idk) { var k = kernel.a var klen = k.length var kw = kernel.w var kh = kernel.h var kx = -((kw / 2)|0) var ky = -((kh / 2)|0) this.filter = function(srcImageData, destImageData){ // assume these are both identically sized canvas objects.. var src = srcImageData.data var dest = destImageData.data var w = srcImageData.width var h = srcImageData.height var ix, iy, it, jx, jy, jt var r, g, b, a for (var i = 0, len = w*h; i < len; i++) { ix = i%w iy = (i/w)|0 it = i * 4 r = g = b = a = 0 for (var j = 0; j < klen; j++) { jx = ix + j%kw + kx jy = iy + ((j/kh)|0) + ky jt = 4 * (jx + jy*w) if (0 > jx || jx > w || 0 > jy || jy > h) { if (edge_zero_fill) { continue } jt = it } r += src[jt] * k[j] g += src[jt+1] * k[j] b += src[jt+2] * k[j] a += src[jt+3] * k[j] } dest[it] = r dest[it+1] = g dest[it+2] = b dest[it+3] = a } return destImageData } this.convolveCanvas = function(image){ var target = document.createElement("canvas") var w = target.width = image.width var h = target.height = image.height var imagectx = image.getContext('2d') var targetctx = target.getContext('2d') targetctx.drawImage(image, 0, 0); // get source pixels var src = imagectx.getImageData(0,0,w,h) var dest = targetctx.getImageData(0,0,w,h) // convolve the cloned image dest = this.filter(src, dest); targetctx.putImageData(dest, 0,0) return target } } ConvolveOp.prototype.EDGE_NO_OP = 0 ConvolveOp.prototype.EDGE_ZERO_FILL = 1