diff --git a/src/modules/AddQR/QR.js b/src/modules/AddQR/QR.js index 487ccbd7..72de51ec 100644 --- a/src/modules/AddQR/QR.js +++ b/src/modules/AddQR/QR.js @@ -1,4 +1,6 @@ module.exports = exports = function (options, pixels, oldPixels, callback) { + const pixelSetter = require('../../util/pixelSetter.js'); + var QRCode = require('qrcode'); QRCode.toDataURL(options.qrCodeString, function (err, url) { var getPixels = require('get-pixels'); @@ -26,17 +28,11 @@ module.exports = exports = function (options, pixels, oldPixels, callback) { for (var m = 0; m < width; m++) { for (var n = 0; n < height; n++) { if (m >= xe && n >= ye) { - pixels.set(m, n, 0, qrPixels.get(m - xe, n - ye, 0)); - pixels.set(m, n, 1, qrPixels.get(m - xe, n - ye, 1)); - pixels.set(m, n, 2, qrPixels.get(m - xe, n - ye, 2)); - pixels.set(m, n, 3, qrPixels.get(m - xe, n - ye, 3)); + pixelSetter(m, n, [qrPixels.get(m - xe, n - ye, 0), qrPixels.get(m - xe, n - ye, 1), qrPixels.get(m - xe, n - ye, 2), qrPixels.get(m - xe, n - ye, 3)], pixels); } else { - pixels.set(m, n, 0, oldPixels.get(m, n, 0)); - pixels.set(m, n, 1, oldPixels.get(m, n, 1)); - pixels.set(m, n, 2, oldPixels.get(m, n, 2)); - pixels.set(m, n, 3, oldPixels.get(m, n, 3)); + pixelSetter(m, n, [qrPixels.get(m, n, 0), qrPixels.get(m, n, 1), qrPixels.get(m, n, 2), qrPixels.get(m, n, 3)], pixels); } } diff --git a/src/modules/Blur/Blur.js b/src/modules/Blur/Blur.js index 28a96d2a..67ea71e3 100755 --- a/src/modules/Blur/Blur.js +++ b/src/modules/Blur/Blur.js @@ -1,4 +1,6 @@ module.exports = exports = function(pixels, blur) { + const pixelSetter = require('../../util/pixelSetter.js'); + let kernel = kernelGenerator(blur), pixs = { r: [], @@ -24,9 +26,10 @@ module.exports = exports = function(pixels, blur) { for (let y = 0; y < pixels.shape[1]; y++){ for (let x = 0; x < pixels.shape[0]; x++){ - pixels.set(x, y, 0, Math.max(0, Math.min(conPix[0][y][x], 255))); - pixels.set(x, y, 1, Math.max(0, Math.min(conPix[1][y][x], 255))); - pixels.set(x, y, 2, Math.max(0, Math.min(conPix[2][y][x], 255))); + var pixelvalue = [Math.max(0, Math.min(conPix[0][y][x], 255)), + Math.max(0, Math.min(conPix[1][y][x], 255)), + Math.max(0, Math.min(conPix[2][y][x], 255))]; + pixelSetter(x, y, pixelvalue, pixels); } } diff --git a/src/modules/CanvasResize/Module.js b/src/modules/CanvasResize/Module.js index b4a54212..cee2ca5e 100644 --- a/src/modules/CanvasResize/Module.js +++ b/src/modules/CanvasResize/Module.js @@ -4,10 +4,10 @@ module.exports = function canvasResize(options, UI) { var defaults = require('./../../util/getDefaults.js')(require('./info.json')); + const pixelSetter = require('../../util/pixelSetter.js'); + var output; - - function draw(input, callback, progressObj) { options.width = parseInt(options.width || defaults.width); @@ -21,16 +21,15 @@ module.exports = function canvasResize(options, UI) { var step = this; function extraManipulation(pixels) { + let newPixels = require('ndarray')(new Uint8Array(4 * options.width * options.height).fill(0), [options.width, options.height, 4]); let iMax = options.width - options.x, jMax = options.height - options.y; for (let i = 0; i < iMax && i < pixels.shape[0]; i++) { for (let j = 0; j < jMax && j < pixels.shape[1]; j++) { let x = i + options.x, y = j + options.y; - newPixels.set(x, y, 0, pixels.get(i, j, 0)); - newPixels.set(x, y, 1, pixels.get(i, j, 1)); - newPixels.set(x, y, 2, pixels.get(i, j, 2)); - newPixels.set(x, y, 3, pixels.get(i, j, 3)); + pixelSetter(x, y, [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2), pixels.get(i, j, 3)], newPixels); + } } return newPixels; diff --git a/src/modules/ColorTemperature/Module.js b/src/modules/ColorTemperature/Module.js index ca2d107f..1b976418 100644 --- a/src/modules/ColorTemperature/Module.js +++ b/src/modules/ColorTemperature/Module.js @@ -1,4 +1,6 @@ module.exports = function ColorTemperature(options, UI) { + + const pixelSetter = require('../../util/pixelSetter.js'); var output; @@ -38,17 +40,12 @@ module.exports = function ColorTemperature(options, UI) { for (let i = 0; i < pixels.shape[0]; i++) { for (let j = 0; j < pixels.shape[1]; j++) { - r_data = pixels.get(i, j, 0); - r_new_data = (255 / r) * r_data; - pixels.set(i, j, 0, r_new_data); + var rgbdata = [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2)]; + rgbdata[0] = (255 / r) * rgbdata[0]; + rgbdata[1] = (255 / g) * rgbdata[1]; + rgbdata[2] = (255 / b) * rgbdata[2]; + pixelSetter(i, j, rgbdata, pixels); - g_data = pixels.get(i, j, 1); - g_new_data = (255 / g) * g_data; - pixels.set(i, j, 1, g_new_data); - - b_data = pixels.get(i, j, 2); - b_new_data = (255 / b) * b_data; - pixels.set(i, j, 2, b_new_data); } } diff --git a/src/modules/Contrast/Contrast.js b/src/modules/Contrast/Contrast.js index 8902aa00..1be556d4 100644 --- a/src/modules/Contrast/Contrast.js +++ b/src/modules/Contrast/Contrast.js @@ -1,4 +1,5 @@ var _ = require('lodash'); +const pixelSetter = require('../../util/pixelSetter.js'); module.exports = exports = function(pixels, contrast) { let oldpix = _.cloneDeep(pixels); @@ -10,37 +11,19 @@ module.exports = exports = function(pixels, contrast) { for (let i = 0; i < pixels.shape[0]; i++) { for (let j = 0; j < pixels.shape[1]; j++) { - var r = oldpix.get(i, j, 0) / 255.0; - r -= 0.5; - r *= contrast; - r += 0.5; - r *= 255; - if (r < 0) r = 0; - if (r > 255) r = 255; - - - var g = oldpix.get(i, j, 1) / 255.0; - g -= 0.5; - g *= contrast; - g += 0.5; - g *= 255; - if (g < 0) g = 0; - if (g > 255) g = 255; - - - var b = oldpix.get(i, j, 2) / 255.0; - b -= 0.5; - b *= contrast; - b += 0.5; - b *= 255; - if (b < 0) b = 0; - if (b > 255) b = 255; - - - pixels.set(i, j, 0, r); - pixels.set(i, j, 1, g); - pixels.set(i, j, 2, b); - + + var rgbarray = [oldpix.get(i, j, 0) / 255.0, oldpix.get(i, j, 1) / 255.0, oldpix.get(i, j, 2) / 255.0]; + for(var idx = 0;idx < 3;idx++){ + rgbarray[idx] -= 0.5; + rgbarray[idx] *= contrast; + rgbarray[idx] += 0.5; + rgbarray[idx] *= 255; + if (rgbarray[idx] < 0) rgbarray[idx] = 0; + if (rgbarray[idx] > 255) rgbarray[idx] = 255; + } + + pixelSetter(i, j, rgbarray, pixels); + } } return pixels; diff --git a/src/modules/Convolution/Convolution.js b/src/modules/Convolution/Convolution.js index eae6db85..b6a4d73d 100644 --- a/src/modules/Convolution/Convolution.js +++ b/src/modules/Convolution/Convolution.js @@ -1,4 +1,6 @@ var _ = require('lodash'); +const pixelSetter = require('../../util/pixelSetter.js'); + module.exports = exports = function(pixels, constantFactor, kernelValues, texMode) { let kernel = kernelGenerator(constantFactor, kernelValues), pixs = { @@ -24,9 +26,8 @@ module.exports = exports = function(pixels, constantFactor, kernelValues, texMod for (let y = 0; y < pixels.shape[1]; y++){ for (let x = 0; x < pixels.shape[0]; x++){ - pixels.set(x, y, 0, Math.max(0, Math.min(conPix[0][y][x], 255))); - pixels.set(x, y, 1, Math.max(0, Math.min(conPix[1][y][x], 255))); - pixels.set(x, y, 2, Math.max(0, Math.min(conPix[2][y][x], 255))); + var value = [Math.max(0, Math.min(conPix[0][y][x], 255)), Math.max(0, Math.min(conPix[1][y][x], 255)), Math.max(0, Math.min(conPix[2][y][x], 255))]; + pixelSetter(x, y, value, pixels); } } diff --git a/src/modules/DrawRectangle/DrawRectangle.js b/src/modules/DrawRectangle/DrawRectangle.js index 31d554ca..a38ac4bd 100644 --- a/src/modules/DrawRectangle/DrawRectangle.js +++ b/src/modules/DrawRectangle/DrawRectangle.js @@ -1,5 +1,6 @@ module.exports = exports = function(pixels, options){ var defaults = require('./../../util/getDefaults.js')(require('./info.json')); + const pixelSetter = require('../../util/pixelSetter.js'); options.startingX = options.startingX || defaults.startingX; options.startingY = options.startingY || defaults.startingY; @@ -17,10 +18,8 @@ module.exports = exports = function(pixels, options){ var drawSide = function(startX, startY, endX, endY){ for (var n = startX; n <= endX + thickness; n++){ for (var k = startY; k <= endY + thickness; k++){ - pixels.set(n, k, 0, color[0]); - pixels.set(n, k, 1, color[1]); - pixels.set(n, k, 2, color[2]); - //pixels.set(n, k, 3, color[3]); + + pixelSetter(n, k, color, pixels); //to remove 4th channel - pixels.set(n, k, 3, color[3]); } } }; diff --git a/src/modules/EdgeDetect/EdgeUtils.js b/src/modules/EdgeDetect/EdgeUtils.js index 4db96002..1a696543 100644 --- a/src/modules/EdgeDetect/EdgeUtils.js +++ b/src/modules/EdgeDetect/EdgeUtils.js @@ -1,4 +1,6 @@ // Define kernels for the sobel filter + +const pixelSetter = require('../../util/pixelSetter.js'); const kernelx = [ [-1, 0, 1], [-2, 0, 2], @@ -41,19 +43,14 @@ module.exports = function(pixels, highThresholdRatio, lowThresholdRatio, useHyst return pixels; }; - function supress(pixels, pixel) { - pixels.set(pixel[0], pixel[1], 0, 0); - pixels.set(pixel[0], pixel[1], 1, 0); - pixels.set(pixel[0], pixel[1], 2, 0); - pixels.set(pixel[0], pixel[1], 3, 255); + pixelSetter(pixel[0], pixel[1], [0, 0, 0, 255], pixels); + } function preserve(pixels, pixel) { - pixels.set(pixel[0], pixel[1], 0, 255); - pixels.set(pixel[0], pixel[1], 1, 255); - pixels.set(pixel[0], pixel[1], 2, 255); - pixels.set(pixel[0], pixel[1], 3, 255); + pixelSetter(pixel[0], pixel[1], [255, 255, 255, 255], pixels); + } // sobelFilter function that convolves sobel kernel over every pixel diff --git a/src/modules/FlipImage/flipImage.js b/src/modules/FlipImage/flipImage.js index 4006cb31..90db6fa0 100644 --- a/src/modules/FlipImage/flipImage.js +++ b/src/modules/FlipImage/flipImage.js @@ -1,12 +1,12 @@ module.exports = function flipImage(oldPixels, pixels, axis) { + const pixelSetter = require('../../util/pixelSetter.js'); + var width = oldPixels.shape[0], height = oldPixels.shape[1]; function copyPixel(x1, y1, x2, y2){ - pixels.set(x1, y1, 0, oldPixels.get(x2, y2, 0)); - pixels.set(x1, y1, 1, oldPixels.get(x2, y2, 1)); - pixels.set(x1, y1, 2, oldPixels.get(x2, y2, 2)); - pixels.set(x1, y1, 3, oldPixels.get(x2, y2, 3)); + pixelSetter(x1, y1, [oldPixels.get(x2, y2, 0), oldPixels.get(x2, y2, 1), oldPixels.get(x2, y2, 2), oldPixels.get(x2, y2, 3)], pixels); + } function flip(){ diff --git a/src/modules/Gradient/Module.js b/src/modules/Gradient/Module.js index 12a00a9d..8d3c1249 100644 --- a/src/modules/Gradient/Module.js +++ b/src/modules/Gradient/Module.js @@ -1,9 +1,11 @@ module.exports = function Invert(options, UI) { + const pixelSetter = require('../../util/pixelSetter.js'); var output; // The function which is called on every draw. - function draw(input, callback, progressObj) { + function draw(input, callback) { + var getPixels = require('get-pixels'); var savePixels = require('save-pixels'); @@ -21,10 +23,8 @@ module.exports = function Invert(options, UI) { for (var i = 0; i < pixels.shape[0]; i++) { for (var j = 0; j < pixels.shape[1]; j++) { let val = (i / width) * 255; - pixels.set(i, j, 0, val); - pixels.set(i, j, 1, val); - pixels.set(i, j, 2, val); - pixels.set(i, j, 3, 255); + pixelSetter(i, j, [val, val, val, 255], pixels); + } } var chunks = []; diff --git a/src/modules/GridOverlay/GridOverlay.js b/src/modules/GridOverlay/GridOverlay.js index ab8d9772..bd473247 100644 --- a/src/modules/GridOverlay/GridOverlay.js +++ b/src/modules/GridOverlay/GridOverlay.js @@ -1,5 +1,6 @@ module.exports = exports = function(pixels, options){ var defaults = require('./../../util/getDefaults.js')(require('./info.json')); + const pixelSetter = require('../../util/pixelSetter.js'); options.x = Number(options.x) || defaults.x; options.y = Number(options.y) || defaults.y; @@ -9,19 +10,15 @@ module.exports = exports = function(pixels, options){ for(var x = 0; x < pixels.shape[0]; x += options.x){ for(var y = 0 ; y < pixels.shape[1]; y++){ - pixels.set(x, y, 0, color[0]); - pixels.set(x, y, 1, color[1]); - pixels.set(x, y, 2, color[2]); - //pixels.set(x, y, 3, color[3]); + pixelSetter(x, y, color, pixels); // to remove 4th channel - pixels.set(x, y, 3, color[3]); + } } for(var y = 0; y < pixels.shape[1]; y += options.y){ for(var x = 0 ; x < pixels.shape[0]; x++){ - pixels.set(x, y, 0, color[0]); - pixels.set(x, y, 1, color[1]); - pixels.set(x, y, 2, color[2]); - //pixels.set(x, y, 3, color[3]); + pixelSetter(x, y, color, pixels); // to remove 4th channel - pixels.set(x, y, 3, color[3]); + } } diff --git a/src/modules/Histogram/Module.js b/src/modules/Histogram/Module.js index aa014caa..3179dec0 100644 --- a/src/modules/Histogram/Module.js +++ b/src/modules/Histogram/Module.js @@ -7,7 +7,9 @@ module.exports = function Channel(options, UI) { function draw(input, callback, progressObj) { - var defaults = require('./../../util/getDefaults.js')(require('./info.json')); + const defaults = require('./../../util/getDefaults.js')(require('./info.json')); + const pixelSetter = require('../../util/pixelSetter.js'); + options.gradient = options.gradient || defaults.gradient; options.gradient = JSON.parse(options.gradient); @@ -32,10 +34,8 @@ module.exports = function Channel(options, UI) { for (let x = 0; x < 256; x++) { for (let y = 0; y < 256; y++) { - pixels.set(x, y, 0, 255); - pixels.set(x, y, 1, 255); - pixels.set(x, y, 2, 255); - pixels.set(x, y, 3, 255); + pixelSetter(x, y, [255, 255, 255, 255], pixels); + } } @@ -43,9 +43,8 @@ module.exports = function Channel(options, UI) { if (options.gradient) { for (let x = 0; x < 256; x++) { for (let y = 0; y < 10; y++) { - pixels.set(x, 255 - y, 0, x); - pixels.set(x, 255 - y, 1, x); - pixels.set(x, 255 - y, 2, x); + pixelSetter(x, 255 - y, [x, x, x], pixels); + } } } @@ -56,9 +55,8 @@ module.exports = function Channel(options, UI) { let pixCount = Math.round(convfactor * hist[x]); for (let y = startY; y < pixCount; y++) { - pixels.set(x, 255 - y, 0, 204); - pixels.set(x, 255 - y, 1, 255); - pixels.set(x, 255 - y, 2, 153); + pixelSetter(x, 255 - y, [204, 255, 153], pixels); + } } diff --git a/src/modules/PaintBucket/PaintBucket.js b/src/modules/PaintBucket/PaintBucket.js index 9bbf3b10..8257e8bf 100644 --- a/src/modules/PaintBucket/PaintBucket.js +++ b/src/modules/PaintBucket/PaintBucket.js @@ -2,6 +2,7 @@ module.exports = exports = function(pixels, options) { let defaults = require('./../../util/getDefaults.js')(require('./info.json')); + const pixelSetter = require('../../util/pixelSetter.js'); let fillColor = options.fillColor || defaults.fillColor, x = parseInt(options.startingX) || defaults.startingX, @@ -47,10 +48,8 @@ module.exports = exports = function(pixels, options) { } while (isSimilar(currx, south) && south < height); for (n = north + 1; n < south; n += 1) { - pixels.set(currx, n, 0, fillColor[0]); - pixels.set(currx, n, 1, fillColor[1]); - pixels.set(currx, n, 2, fillColor[2]); - pixels.set(currx, n, 3, fillColor[3]); + pixelSetter(currx, n, fillColor, pixels); + if (isSimilar(currx - 1, n)) { queuex.push(currx - 1); queuey.push(n); diff --git a/src/modules/ReplaceColor/ReplaceColor.js b/src/modules/ReplaceColor/ReplaceColor.js index 9be5bdf0..db60fa54 100644 --- a/src/modules/ReplaceColor/ReplaceColor.js +++ b/src/modules/ReplaceColor/ReplaceColor.js @@ -1,4 +1,6 @@ module.exports = exports = function(pixels, options){ + const pixelSetter = require('../../util/pixelSetter.js'); + var color = options.color || 'rgb(228,86,81)'; color = color.substring(color.indexOf('(') + 1, color.length - 1); // extract only the values from rgba(_,_,_,_) @@ -23,7 +25,6 @@ module.exports = exports = function(pixels, options){ g >= cg * minFactor && g <= cg * maxFactor && b >= cb * minFactor && b <= cb * maxFactor); } - for(var i = 0; i < pixels.shape[0]; i++){ for(var j = 0; j < pixels.shape[1]; j++){ var r = pixels.get(i, j, 0), @@ -32,16 +33,16 @@ module.exports = exports = function(pixels, options){ if(isSimilar(r, g, b)){ if (replaceMethod == 'greyscale'){ var avg = (r + g + b) / 3; - pixels.set(i, j, 0, avg); - pixels.set(i, j, 1, avg); - pixels.set(i, j, 2, avg); + pixelSetter(i, j, [avg, avg, avg], pixels); + }else { - pixels.set(i, j, 0, replaceColor[0]); - pixels.set(i, j, 1, replaceColor[1]); - pixels.set(i, j, 2, replaceColor[2]); + pixelSetter(i, j, replaceColor, pixels); + } } } + + } return pixels; }; \ No newline at end of file diff --git a/src/modules/_nomodule/PixelManipulation.js b/src/modules/_nomodule/PixelManipulation.js index 6cf22291..6bcf1765 100644 --- a/src/modules/_nomodule/PixelManipulation.js +++ b/src/modules/_nomodule/PixelManipulation.js @@ -5,6 +5,9 @@ module.exports = function PixelManipulation(image, options) { // To handle the case where pixelmanipulation is called on the input object itself // like input.pixelManipulation(options) + + const pixelSetter = require('../../util/pixelSetter.js'); + if (arguments.length <= 1) { options = image; image = this; @@ -86,10 +89,8 @@ module.exports = function PixelManipulation(image, options) { y ); - pixels.set(x, y, 0, pixel[0]); - pixels.set(x, y, 1, pixel[1]); - pixels.set(x, y, 2, pixel[2]); - pixels.set(x, y, 3, pixel[3]); + pixelSetter(x, y, pixel, pixels); + } } }; diff --git a/src/util/pixelSetter.js b/src/util/pixelSetter.js new file mode 100644 index 00000000..ab098575 --- /dev/null +++ b/src/util/pixelSetter.js @@ -0,0 +1,5 @@ +module.exports = function(x, y, value, pixels){ + for(let i = 0; i < value.length; i++){ + pixels.set(x, y, i, value[i]); + } +}; \ No newline at end of file