UNPKG

mighty-webcamjs

Version:

HTML5 Webcam Image Capture Library with Flash Fallback

967 lines (873 loc) 28.2 kB
"use strict"; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // source: https://github.com/CezaryDanielNowak/inspector-bokeh/ (function (f) { if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") { module.exports = f(); } else if (typeof define === "function" && define.amd) { define([], f); } else { var g;if (typeof window !== "undefined") { g = window; } else if (typeof global !== "undefined") { g = global; } else if (typeof self !== "undefined") { g = self; } else { g = this; }g.measureBlur = f(); } })(function () { var define, module, exports;return function () { function r(e, n, t) { function o(i, f) { if (!n[i]) { if (!e[i]) { var c = "function" == typeof require && require;if (!f && c) return c(i, !0);if (u) return u(i, !0);var a = new Error("Cannot find module '" + i + "'");throw a.code = "MODULE_NOT_FOUND", a; }var p = n[i] = { exports: {} };e[i][0].call(p.exports, function (r) { var n = e[i][1][r];return o(n || r); }, p, p.exports, r, e, n, t); }return n[i].exports; }for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) { o(t[i]); }return o; }return r; }()({ 1: [function (require, module, exports) { var Filters = require('canvasfilters').Filters; function detectEdges(imageData) { var greyscaled, sobelKernel; if (imageData.width >= 360) { greyscaled = Filters.luminance(Filters.gaussianBlur(imageData, 5.0)); } else { greyscaled = Filters.luminance(imageData); } sobelKernel = Filters.getFloat32Array([1, 0, -1, 2, 0, -2, 1, 0, -1]); return Filters.convolve(greyscaled, sobelKernel, true); } // Reduce imageData from RGBA to only one channel (Y/luminance after conversion to greyscale) // since RGB all have the same values and Alpha was ignored. function reducedPixels(imageData) { var i, x, y, row, pixels = imageData.data, rowLen = imageData.width * 4, rows = []; for (y = 0; y < pixels.length; y += rowLen) { row = new Uint8ClampedArray(imageData.width); x = 0; for (i = y; i < y + rowLen; i += 4) { row[x] = pixels[i]; x += 1; } rows.push(row); } return rows; } // pixels = Array of Uint8ClampedArrays (row in original image) function detectBlur(pixels) { var x, y, value, oldValue, edgeStart, edgeWidth, bm, percWidth, width = pixels[0].length, height = pixels.length, numEdges = 0, sumEdgeWidths = 0, edgeIntensThresh = 20; for (y = 0; y < height; y += 1) { // Reset edge marker, none found yet edgeStart = -1; for (x = 0; x < width; x += 1) { value = pixels[y][x]; // Edge is still open if (edgeStart >= 0 && x > edgeStart) { oldValue = pixels[y][x - 1]; // Value stopped increasing => edge ended if (value < oldValue) { // Only count edges that reach a certain intensity if (oldValue >= edgeIntensThresh) { edgeWidth = x - edgeStart - 1; numEdges += 1; sumEdgeWidths += edgeWidth; } edgeStart = -1; // Reset edge marker } } // Edge starts if (value == 0) { edgeStart = x; } } } if (numEdges === 0) { bm = 0; percWidth = 0; } else { bm = sumEdgeWidths / numEdges; percWidth = bm / width * 100; } return { width: width, height: height, num_edges: numEdges, avg_edge_width: bm, avg_edge_width_perc: percWidth }; } function measureBlur(imageData) { return detectBlur(reducedPixels(detectEdges(imageData))); } measureBlur.setup = function () { throw new Error('[inspector-bokeh error] Setup is availabe only in inspector-bookeh/async!'); }; module.exports = measureBlur; }, { "canvasfilters": 2 }], 2: [function (require, module, exports) { var Filters = {}; if (typeof Float32Array == 'undefined') { Filters.getFloat32Array = Filters.getUint8Array = function (len) { if (len.length) { return len.slice(0); } return new Array(len); }; } else { Filters.getFloat32Array = function (len) { return new Float32Array(len); }; Filters.getUint8Array = function (len) { return new Uint8Array(len); }; } if (typeof document != 'undefined') { Filters.tmpCanvas = document.createElement('canvas'); Filters.tmpCtx = Filters.tmpCanvas.getContext('2d'); Filters.getPixels = function (img) { var c, ctx; if (img.getContext) { c = img; try { ctx = c.getContext('2d'); } catch (e) {} } if (!ctx) { c = this.getCanvas(img.width, img.height); ctx = c.getContext('2d'); ctx.drawImage(img, 0, 0); } return ctx.getImageData(0, 0, c.width, c.height); }; Filters.createImageData = function (w, h) { return this.tmpCtx.createImageData(w, h); }; Filters.getCanvas = function (w, h) { var c = document.createElement('canvas'); c.width = w; c.height = h; return c; }; Filters.filterImage = function (filter, image, var_args) { var args = [this.getPixels(image)]; for (var i = 2; i < arguments.length; i++) { args.push(arguments[i]); } return filter.apply(this, args); }; Filters.toCanvas = function (pixels) { var canvas = this.getCanvas(pixels.width, pixels.height); canvas.getContext('2d').putImageData(pixels, 0, 0); return canvas; }; Filters.toImageData = function (pixels) { return this.identity(pixels); }; } else { onmessage = function onmessage(e) { var ds = e.data; if (!ds.length) { ds = [ds]; } postMessage(Filters.runPipeline(ds)); }; Filters.createImageData = function (w, h) { return { width: w, height: h, data: this.getFloat32Array(w * h * 4) }; }; } Filters.runPipeline = function (ds) { var res = null; res = this[ds[0].name].apply(this, ds[0].args); for (var i = 1; i < ds.length; i++) { var d = ds[i]; var args = d.args.slice(0); args.unshift(res); res = this[d.name].apply(this, args); } return res; }; Filters.createImageDataFloat32 = function (w, h) { return { width: w, height: h, data: this.getFloat32Array(w * h * 4) }; }; Filters.identity = function (pixels, args) { var output = Filters.createImageData(pixels.width, pixels.height); var dst = output.data; var d = pixels.data; for (var i = 0; i < d.length; i++) { dst[i] = d[i]; } return output; }; Filters.horizontalFlip = function (pixels) { var output = Filters.createImageData(pixels.width, pixels.height); var w = pixels.width; var h = pixels.height; var dst = output.data; var d = pixels.data; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var off = (y * w + x) * 4; var dstOff = (y * w + (w - x - 1)) * 4; dst[dstOff] = d[off]; dst[dstOff + 1] = d[off + 1]; dst[dstOff + 2] = d[off + 2]; dst[dstOff + 3] = d[off + 3]; } } return output; }; Filters.verticalFlip = function (pixels) { var output = Filters.createImageData(pixels.width, pixels.height); var w = pixels.width; var h = pixels.height; var dst = output.data; var d = pixels.data; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var off = (y * w + x) * 4; var dstOff = ((h - y - 1) * w + x) * 4; dst[dstOff] = d[off]; dst[dstOff + 1] = d[off + 1]; dst[dstOff + 2] = d[off + 2]; dst[dstOff + 3] = d[off + 3]; } } return output; }; Filters.luminance = function (pixels, args) { var output = Filters.createImageData(pixels.width, pixels.height); var dst = output.data; var d = pixels.data; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; // CIE luminance for the RGB var v = 0.2126 * r + 0.7152 * g + 0.0722 * b; dst[i] = dst[i + 1] = dst[i + 2] = v; dst[i + 3] = d[i + 3]; } return output; }; Filters.grayscale = function (pixels, args) { var output = Filters.createImageData(pixels.width, pixels.height); var dst = output.data; var d = pixels.data; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; var v = 0.3 * r + 0.59 * g + 0.11 * b; dst[i] = dst[i + 1] = dst[i + 2] = v; dst[i + 3] = d[i + 3]; } return output; }; Filters.grayscaleAvg = function (pixels, args) { var output = Filters.createImageData(pixels.width, pixels.height); var dst = output.data; var d = pixels.data; var f = 1 / 3; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; var v = (r + g + b) * f; dst[i] = dst[i + 1] = dst[i + 2] = v; dst[i + 3] = d[i + 3]; } return output; }; Filters.threshold = function (pixels, threshold, high, low) { var output = Filters.createImageData(pixels.width, pixels.height); if (high == null) high = 255; if (low == null) low = 0; var d = pixels.data; var dst = output.data; for (var i = 0; i < d.length; i += 4) { var r = d[i]; var g = d[i + 1]; var b = d[i + 2]; var v = 0.3 * r + 0.59 * g + 0.11 * b >= threshold ? high : low; dst[i] = dst[i + 1] = dst[i + 2] = v; dst[i + 3] = d[i + 3]; } return output; }; Filters.invert = function (pixels) { var output = Filters.createImageData(pixels.width, pixels.height); var d = pixels.data; var dst = output.data; for (var i = 0; i < d.length; i += 4) { dst[i] = 255 - d[i]; dst[i + 1] = 255 - d[i + 1]; dst[i + 2] = 255 - d[i + 2]; dst[i + 3] = d[i + 3]; } return output; }; Filters.brightnessContrast = function (pixels, brightness, contrast) { var lut = this.brightnessContrastLUT(brightness, contrast); return this.applyLUT(pixels, { r: lut, g: lut, b: lut, a: this.identityLUT() }); }; Filters.applyLUT = function (pixels, lut) { var output = Filters.createImageData(pixels.width, pixels.height); var d = pixels.data; var dst = output.data; var r = lut.r; var g = lut.g; var b = lut.b; var a = lut.a; for (var i = 0; i < d.length; i += 4) { dst[i] = r[d[i]]; dst[i + 1] = g[d[i + 1]]; dst[i + 2] = b[d[i + 2]]; dst[i + 3] = a[d[i + 3]]; } return output; }; Filters.createLUTFromCurve = function (points) { var lut = this.getUint8Array(256); var p = [0, 0]; for (var i = 0, j = 0; i < lut.length; i++) { while (j < points.length && points[j][0] < i) { p = points[j]; j++; } lut[i] = p[1]; } return lut; }; Filters.identityLUT = function () { var lut = this.getUint8Array(256); for (var i = 0; i < lut.length; i++) { lut[i] = i; } return lut; }; Filters.invertLUT = function () { var lut = this.getUint8Array(256); for (var i = 0; i < lut.length; i++) { lut[i] = 255 - i; } return lut; }; Filters.brightnessContrastLUT = function (brightness, contrast) { var lut = this.getUint8Array(256); var contrastAdjust = -128 * contrast + 128; var brightnessAdjust = 255 * brightness; var adjust = contrastAdjust + brightnessAdjust; for (var i = 0; i < lut.length; i++) { var c = i * contrast + adjust; lut[i] = c < 0 ? 0 : c > 255 ? 255 : c; } return lut; }; Filters.convolve = function (pixels, weights, opaque) { var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageData(w, h); var dst = output.data; var alphaFac = opaque ? 1 : 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var r = 0, g = 0, b = 0, a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = Math.min(sh - 1, Math.max(0, sy + cy - halfSide)); var scx = Math.min(sw - 1, Math.max(0, sx + cx - halfSide)); var srcOff = (scy * sw + scx) * 4; var wt = weights[cy * side + cx]; r += src[srcOff] * wt; g += src[srcOff + 1] * wt; b += src[srcOff + 2] * wt; a += src[srcOff + 3] * wt; } } dst[dstOff] = r; dst[dstOff + 1] = g; dst[dstOff + 2] = b; dst[dstOff + 3] = a + alphaFac * (255 - a); } } return output; }; Filters.verticalConvolve = function (pixels, weightsVector, opaque) { var side = weightsVector.length; var halfSide = Math.floor(side / 2); var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageData(w, h); var dst = output.data; var alphaFac = opaque ? 1 : 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var r = 0, g = 0, b = 0, a = 0; for (var cy = 0; cy < side; cy++) { var scy = Math.min(sh - 1, Math.max(0, sy + cy - halfSide)); var scx = sx; var srcOff = (scy * sw + scx) * 4; var wt = weightsVector[cy]; r += src[srcOff] * wt; g += src[srcOff + 1] * wt; b += src[srcOff + 2] * wt; a += src[srcOff + 3] * wt; } dst[dstOff] = r; dst[dstOff + 1] = g; dst[dstOff + 2] = b; dst[dstOff + 3] = a + alphaFac * (255 - a); } } return output; }; Filters.horizontalConvolve = function (pixels, weightsVector, opaque) { var side = weightsVector.length; var halfSide = Math.floor(side / 2); var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageData(w, h); var dst = output.data; var alphaFac = opaque ? 1 : 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var r = 0, g = 0, b = 0, a = 0; for (var cx = 0; cx < side; cx++) { var scy = sy; var scx = Math.min(sw - 1, Math.max(0, sx + cx - halfSide)); var srcOff = (scy * sw + scx) * 4; var wt = weightsVector[cx]; r += src[srcOff] * wt; g += src[srcOff + 1] * wt; b += src[srcOff + 2] * wt; a += src[srcOff + 3] * wt; } dst[dstOff] = r; dst[dstOff + 1] = g; dst[dstOff + 2] = b; dst[dstOff + 3] = a + alphaFac * (255 - a); } } return output; }; Filters.separableConvolve = function (pixels, horizWeights, vertWeights, opaque) { return this.horizontalConvolve(this.verticalConvolveFloat32(pixels, vertWeights, opaque), horizWeights, opaque); }; Filters.convolveFloat32 = function (pixels, weights, opaque) { var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageDataFloat32(w, h); var dst = output.data; var alphaFac = opaque ? 1 : 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var r = 0, g = 0, b = 0, a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = Math.min(sh - 1, Math.max(0, sy + cy - halfSide)); var scx = Math.min(sw - 1, Math.max(0, sx + cx - halfSide)); var srcOff = (scy * sw + scx) * 4; var wt = weights[cy * side + cx]; r += src[srcOff] * wt; g += src[srcOff + 1] * wt; b += src[srcOff + 2] * wt; a += src[srcOff + 3] * wt; } } dst[dstOff] = r; dst[dstOff + 1] = g; dst[dstOff + 2] = b; dst[dstOff + 3] = a + alphaFac * (255 - a); } } return output; }; Filters.verticalConvolveFloat32 = function (pixels, weightsVector, opaque) { var side = weightsVector.length; var halfSide = Math.floor(side / 2); var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageDataFloat32(w, h); var dst = output.data; var alphaFac = opaque ? 1 : 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var r = 0, g = 0, b = 0, a = 0; for (var cy = 0; cy < side; cy++) { var scy = Math.min(sh - 1, Math.max(0, sy + cy - halfSide)); var scx = sx; var srcOff = (scy * sw + scx) * 4; var wt = weightsVector[cy]; r += src[srcOff] * wt; g += src[srcOff + 1] * wt; b += src[srcOff + 2] * wt; a += src[srcOff + 3] * wt; } dst[dstOff] = r; dst[dstOff + 1] = g; dst[dstOff + 2] = b; dst[dstOff + 3] = a + alphaFac * (255 - a); } } return output; }; Filters.horizontalConvolveFloat32 = function (pixels, weightsVector, opaque) { var side = weightsVector.length; var halfSide = Math.floor(side / 2); var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageDataFloat32(w, h); var dst = output.data; var alphaFac = opaque ? 1 : 0; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var r = 0, g = 0, b = 0, a = 0; for (var cx = 0; cx < side; cx++) { var scy = sy; var scx = Math.min(sw - 1, Math.max(0, sx + cx - halfSide)); var srcOff = (scy * sw + scx) * 4; var wt = weightsVector[cx]; r += src[srcOff] * wt; g += src[srcOff + 1] * wt; b += src[srcOff + 2] * wt; a += src[srcOff + 3] * wt; } dst[dstOff] = r; dst[dstOff + 1] = g; dst[dstOff + 2] = b; dst[dstOff + 3] = a + alphaFac * (255 - a); } } return output; }; Filters.separableConvolveFloat32 = function (pixels, horizWeights, vertWeights, opaque) { return this.horizontalConvolveFloat32(this.verticalConvolveFloat32(pixels, vertWeights, opaque), horizWeights, opaque); }; Filters.gaussianBlur = function (pixels, diameter) { diameter = Math.abs(diameter); if (diameter <= 1) return Filters.identity(pixels); var radius = diameter / 2; var len = Math.ceil(diameter) + (1 - Math.ceil(diameter) % 2); var weights = this.getFloat32Array(len); var rho = (radius + 0.5) / 3; var rhoSq = rho * rho; var gaussianFactor = 1 / Math.sqrt(2 * Math.PI * rhoSq); var rhoFactor = -1 / (2 * rho * rho); var wsum = 0; var middle = Math.floor(len / 2); for (var i = 0; i < len; i++) { var x = i - middle; var gx = gaussianFactor * Math.exp(x * x * rhoFactor); weights[i] = gx; wsum += gx; } for (var i = 0; i < weights.length; i++) { weights[i] /= wsum; } return Filters.separableConvolve(pixels, weights, weights, false); }; Filters.laplaceKernel = Filters.getFloat32Array([-1, -1, -1, -1, 8, -1, -1, -1, -1]); Filters.laplace = function (pixels) { return Filters.convolve(pixels, this.laplaceKernel, true); }; Filters.sobelSignVector = Filters.getFloat32Array([-1, 0, 1]); Filters.sobelScaleVector = Filters.getFloat32Array([1, 2, 1]); Filters.sobelVerticalGradient = function (px) { return this.separableConvolveFloat32(px, this.sobelSignVector, this.sobelScaleVector); }; Filters.sobelHorizontalGradient = function (px) { return this.separableConvolveFloat32(px, this.sobelScaleVector, this.sobelSignVector); }; Filters.sobelVectors = function (px) { var vertical = this.sobelVerticalGradient(px); var horizontal = this.sobelHorizontalGradient(px); var id = { width: vertical.width, height: vertical.height, data: this.getFloat32Array(vertical.width * vertical.height * 8) }; var vd = vertical.data; var hd = horizontal.data; var idd = id.data; for (var i = 0, j = 0; i < idd.length; i += 2, j++) { idd[i] = hd[j]; idd[i + 1] = vd[j]; } return id; }; Filters.sobel = function (px) { px = this.grayscale(px); var vertical = this.sobelVerticalGradient(px); var horizontal = this.sobelHorizontalGradient(px); var id = this.createImageData(vertical.width, vertical.height); for (var i = 0; i < id.data.length; i += 4) { var v = Math.abs(vertical.data[i]); id.data[i] = v; var h = Math.abs(horizontal.data[i]); id.data[i + 1] = h; id.data[i + 2] = (v + h) / 4; id.data[i + 3] = 255; } return id; }; Filters.bilinearSample = function (pixels, x, y, rgba) { var x1 = Math.floor(x); var x2 = Math.ceil(x); var y1 = Math.floor(y); var y2 = Math.ceil(y); var a = (x1 + pixels.width * y1) * 4; var b = (x2 + pixels.width * y1) * 4; var c = (x1 + pixels.width * y2) * 4; var d = (x2 + pixels.width * y2) * 4; var df = x - x1 + (y - y1); var cf = x2 - x + (y - y1); var bf = x - x1 + (y2 - y); var af = x2 - x + (y2 - y); var rsum = 1 / (af + bf + cf + df); af *= rsum; bf *= rsum; cf *= rsum; df *= rsum; var data = pixels.data; rgba[0] = data[a] * af + data[b] * bf + data[c] * cf + data[d] * df; rgba[1] = data[a + 1] * af + data[b + 1] * bf + data[c + 1] * cf + data[d + 1] * df; rgba[2] = data[a + 2] * af + data[b + 2] * bf + data[c + 2] * cf + data[d + 2] * df; rgba[3] = data[a + 3] * af + data[b + 3] * bf + data[c + 3] * cf + data[d + 3] * df; return rgba; }; Filters.distortSine = function (pixels, amount, yamount) { if (amount == null) amount = 0.5; if (yamount == null) yamount = amount; var output = this.createImageData(pixels.width, pixels.height); var dst = output.data; var d = pixels.data; var px = this.createImageData(1, 1).data; for (var y = 0; y < output.height; y++) { var sy = -Math.sin(y / (output.height - 1) * Math.PI * 2); var srcY = y + sy * yamount * output.height / 4; srcY = Math.max(Math.min(srcY, output.height - 1), 0); for (var x = 0; x < output.width; x++) { var sx = -Math.sin(x / (output.width - 1) * Math.PI * 2); var srcX = x + sx * amount * output.width / 4; srcX = Math.max(Math.min(srcX, output.width - 1), 0); var rgba = this.bilinearSample(pixels, srcX, srcY, px); var off = (y * output.width + x) * 4; dst[off] = rgba[0]; dst[off + 1] = rgba[1]; dst[off + 2] = rgba[2]; dst[off + 3] = rgba[3]; } } return output; }; Filters.darkenBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = a[i] < b[i] ? a[i] : b[i]; dst[i + 1] = a[i + 1] < b[i + 1] ? a[i + 1] : b[i + 1]; dst[i + 2] = a[i + 2] < b[i + 2] ? a[i + 2] : b[i + 2]; dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.lightenBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = a[i] > b[i] ? a[i] : b[i]; dst[i + 1] = a[i + 1] > b[i + 1] ? a[i + 1] : b[i + 1]; dst[i + 2] = a[i + 2] > b[i + 2] ? a[i + 2] : b[i + 2]; dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.multiplyBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = a[i] * b[i] * f; dst[i + 1] = a[i + 1] * b[i + 1] * f; dst[i + 2] = a[i + 2] * b[i + 2] * f; dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.screenBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = a[i] + b[i] - a[i] * b[i] * f; dst[i + 1] = a[i + 1] + b[i + 1] - a[i + 1] * b[i + 1] * f; dst[i + 2] = a[i + 2] + b[i + 2] - a[i + 2] * b[i + 2] * f; dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.addBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = a[i] + b[i]; dst[i + 1] = a[i + 1] + b[i + 1]; dst[i + 2] = a[i + 2] + b[i + 2]; dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.subBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = a[i] + b[i] - 255; dst[i + 1] = a[i + 1] + b[i + 1] - 255; dst[i + 2] = a[i + 2] + b[i + 2] - 255; dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.differenceBlend = function (below, above) { var output = Filters.createImageData(below.width, below.height); var a = below.data; var b = above.data; var dst = output.data; var f = 1 / 255; for (var i = 0; i < a.length; i += 4) { dst[i] = Math.abs(a[i] - b[i]); dst[i + 1] = Math.abs(a[i + 1] - b[i + 1]); dst[i + 2] = Math.abs(a[i + 2] - b[i + 2]); dst[i + 3] = a[i + 3] + (255 - a[i + 3]) * b[i + 3] * f; } return output; }; Filters.erode = function (pixels) { var src = pixels.data; var sw = pixels.width; var sh = pixels.height; var w = sw; var h = sh; var output = Filters.createImageData(w, h); var dst = output.data; for (var y = 0; y < h; y++) { for (var x = 0; x < w; x++) { var sy = y; var sx = x; var dstOff = (y * w + x) * 4; var srcOff = (sy * sw + sx) * 4; var v = 0; if (src[srcOff] == 0) { if (src[(sy * sw + Math.max(0, sx - 1)) * 4] == 0 && src[(Math.max(0, sy - 1) * sw + sx) * 4] == 0) { v = 255; } } else { v = 255; } dst[dstOff] = v; dst[dstOff + 1] = v; dst[dstOff + 2] = v; dst[dstOff + 3] = 255; } } return output; }; if (typeof require != 'undefined') { exports.Filters = Filters; } }, {}] }, {}, [1])(1); });