diff options
Diffstat (limited to 'convolve.js')
| -rw-r--r-- | convolve.js | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/convolve.js b/convolve.js new file mode 100644 index 0000000..2e59c6c --- /dev/null +++ b/convolve.js @@ -0,0 +1,79 @@ +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 |
