/* eslint-disable no-labels */ import { isNodePattern } from '@jimp/utils'; /** * Get an image's histogram * @return {object} An object with an array of color occurrence counts for each channel (r,g,b) */ function histogram() { var histogram = { r: new Array(256).fill(0), g: new Array(256).fill(0), b: new Array(256).fill(0) }; this.scanQuiet(0, 0, this.bitmap.width, this.bitmap.height, function (x, y, index) { histogram.r[this.bitmap.data[index + 0]]++; histogram.g[this.bitmap.data[index + 1]]++; histogram.b[this.bitmap.data[index + 2]]++; }); return histogram; } /** * Normalize values * @param {integer} value Pixel channel value. * @param {integer} min Minimum value for channel * @param {integer} max Maximum value for channel * @return {integer} normalized values */ var _normalize = function normalize(value, min, max) { return (value - min) * 255 / (max - min); }; var getBounds = function getBounds(histogramChannel) { return [histogramChannel.findIndex(function (value) { return value > 0; }), 255 - histogramChannel.slice().reverse().findIndex(function (value) { return value > 0; })]; }; /** * Normalizes the image * @param {function(Error, Jimp)} cb (optional) a callback for when complete * @returns {Jimp} this for chaining of methods */ export default (function () { return { normalize: function normalize(cb) { var h = histogram.call(this); // store bounds (minimum and maximum values) var bounds = { r: getBounds(h.r), g: getBounds(h.g), b: getBounds(h.b) }; // apply value transformations this.scanQuiet(0, 0, this.bitmap.width, this.bitmap.height, function (x, y, idx) { var r = this.bitmap.data[idx + 0]; var g = this.bitmap.data[idx + 1]; var b = this.bitmap.data[idx + 2]; this.bitmap.data[idx + 0] = _normalize(r, bounds.r[0], bounds.r[1]); this.bitmap.data[idx + 1] = _normalize(g, bounds.g[0], bounds.g[1]); this.bitmap.data[idx + 2] = _normalize(b, bounds.b[0], bounds.b[1]); }); if (isNodePattern(cb)) { cb.call(this, null, this); } return this; } }; }); //# sourceMappingURL=index.js.map