1 line
18 KiB
Plaintext
1 line
18 KiB
Plaintext
{"version":3,"sources":["../src/index.js"],"names":["throwError","isNodePattern","pluginCrop","event","x","y","w","h","cb","call","Math","round","bitmap","width","start","end","data","slice","Buffer","allocUnsafe","offset","scanQuiet","idx","readUInt32BE","writeUInt32BE","height","class","autocrop","minPixelsPerSide","leaveBorder","tolerance","cropOnlyFrames","cropSymmetric","a","len","length","config","colorTarget","getPixelColor","rgba1","constructor","intToRGBA","northPixelsToCrop","eastPixelsToCrop","southPixelsToCrop","westPixelsToCrop","north","colorXY","rgba2","colorDiff","east","south","west","doCrop","horizontal","min","vertical","widthOfRemainingPixels","heightOfRemainingPixels","crop"],"mappings":"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","sourcesContent":["/* eslint-disable no-labels */\n\nimport { throwError, isNodePattern } from '@jimp/utils';\n\nexport default function pluginCrop(event) {\n /**\n * Crops the image at a given point to a give size\n * @param {number} x the x coordinate to crop form\n * @param {number} y the y coordinate to crop form\n * @param w the width of the crop region\n * @param h the height of the crop region\n * @param {function(Error, Jimp)} cb (optional) a callback for when complete\n * @returns {Jimp} this for chaining of methods\n */\n event('crop', function(x, y, w, h, cb) {\n if (typeof x !== 'number' || typeof y !== 'number')\n return throwError.call(this, 'x and y must be numbers', cb);\n if (typeof w !== 'number' || typeof h !== 'number')\n return throwError.call(this, 'w and h must be numbers', cb);\n\n // round input\n x = Math.round(x);\n y = Math.round(y);\n w = Math.round(w);\n h = Math.round(h);\n\n if (x === 0 && w === this.bitmap.width) {\n // shortcut\n const start = (w * y + x) << 2;\n const end = (start + h * w) << (2 + 1);\n\n this.bitmap.data = this.bitmap.data.slice(start, end);\n } else {\n const bitmap = Buffer.allocUnsafe(w * h * 4);\n let offset = 0;\n\n this.scanQuiet(x, y, w, h, function(x, y, idx) {\n const data = this.bitmap.data.readUInt32BE(idx, true);\n bitmap.writeUInt32BE(data, offset, true);\n offset += 4;\n });\n\n this.bitmap.data = bitmap;\n }\n\n this.bitmap.width = w;\n this.bitmap.height = h;\n\n if (isNodePattern(cb)) {\n cb.call(this, null, this);\n }\n\n return this;\n });\n\n return {\n class: {\n /**\n * Autocrop same color borders from this image\n * @param {number} tolerance (optional): a percent value of tolerance for pixels color difference (default: 0.0002%)\n * @param {boolean} cropOnlyFrames (optional): flag to crop only real frames: all 4 sides of the image must have some border (default: true)\n * @param {function(Error, Jimp)} cb (optional): a callback for when complete (default: no callback)\n * @returns {Jimp} this for chaining of methods\n */\n autocrop(...args) {\n const w = this.bitmap.width;\n const h = this.bitmap.height;\n const minPixelsPerSide = 1; // to avoid cropping completely the image, resulting in an invalid 0 sized image\n\n let cb; // callback\n let leaveBorder = 0; // Amount of pixels in border to leave\n let tolerance = 0.0002; // percent of color difference tolerance (default value)\n let cropOnlyFrames = true; // flag to force cropping only if the image has a real \"frame\"\n // i.e. all 4 sides have some border (default value)\n let cropSymmetric = false; // flag to force cropping top be symmetric.\n // i.e. north and south / east and west are cropped by the same value\n\n // parse arguments\n for (let a = 0, len = args.length; a < len; a++) {\n if (typeof args[a] === 'number') {\n // tolerance value passed\n tolerance = args[a];\n }\n\n if (typeof args[a] === 'boolean') {\n // cropOnlyFrames value passed\n cropOnlyFrames = args[a];\n }\n\n if (typeof args[a] === 'function') {\n // callback value passed\n cb = args[a];\n }\n\n if (typeof args[a] === 'object') {\n // config object passed\n const config = args[a];\n\n if (typeof config.tolerance !== 'undefined') {\n ({ tolerance } = config);\n }\n\n if (typeof config.cropOnlyFrames !== 'undefined') {\n ({ cropOnlyFrames } = config);\n }\n\n if (typeof config.cropSymmetric !== 'undefined') {\n ({ cropSymmetric } = config);\n }\n\n if (typeof config.leaveBorder !== 'undefined') {\n ({ leaveBorder } = config);\n }\n }\n }\n\n /**\n * All borders must be of the same color as the top left pixel, to be cropped.\n * It should be possible to crop borders each with a different color,\n * but since there are many ways for corners to intersect, it would\n * introduce unnecessary complexity to the algorithm.\n */\n\n // scan each side for same color borders\n let colorTarget = this.getPixelColor(0, 0); // top left pixel color is the target color\n const rgba1 = this.constructor.intToRGBA(colorTarget);\n\n // for north and east sides\n let northPixelsToCrop = 0;\n let eastPixelsToCrop = 0;\n let southPixelsToCrop = 0;\n let westPixelsToCrop = 0;\n\n // north side (scan rows from north to south)\n colorTarget = this.getPixelColor(0, 0);\n north: for (let y = 0; y < h - minPixelsPerSide; y++) {\n for (let x = 0; x < w; x++) {\n const colorXY = this.getPixelColor(x, y);\n const rgba2 = this.constructor.intToRGBA(colorXY);\n\n if (this.constructor.colorDiff(rgba1, rgba2) > tolerance) {\n // this pixel is too distant from the first one: abort this side scan\n break north;\n }\n }\n // this row contains all pixels with the same color: increment this side pixels to crop\n northPixelsToCrop++;\n }\n\n // east side (scan columns from east to west)\n colorTarget = this.getPixelColor(w, 0);\n east: for (let x = 0; x < w - minPixelsPerSide; x++) {\n for (let y = 0 + northPixelsToCrop; y < h; y++) {\n const colorXY = this.getPixelColor(x, y);\n const rgba2 = this.constructor.intToRGBA(colorXY);\n\n if (this.constructor.colorDiff(rgba1, rgba2) > tolerance) {\n // this pixel is too distant from the first one: abort this side scan\n break east;\n }\n }\n // this column contains all pixels with the same color: increment this side pixels to crop\n eastPixelsToCrop++;\n }\n\n // south side (scan rows from south to north)\n colorTarget = this.getPixelColor(0, h);\n south: for (\n let y = h - 1;\n y >= northPixelsToCrop + minPixelsPerSide;\n y--\n ) {\n for (let x = w - eastPixelsToCrop - 1; x >= 0; x--) {\n const colorXY = this.getPixelColor(x, y);\n const rgba2 = this.constructor.intToRGBA(colorXY);\n\n if (this.constructor.colorDiff(rgba1, rgba2) > tolerance) {\n // this pixel is too distant from the first one: abort this side scan\n break south;\n }\n }\n // this row contains all pixels with the same color: increment this side pixels to crop\n southPixelsToCrop++;\n }\n\n // west side (scan columns from west to east)\n colorTarget = this.getPixelColor(w, h);\n west: for (\n let x = w - 1;\n x >= 0 + eastPixelsToCrop + minPixelsPerSide;\n x--\n ) {\n for (let y = h - 1; y >= 0 + northPixelsToCrop; y--) {\n const colorXY = this.getPixelColor(x, y);\n const rgba2 = this.constructor.intToRGBA(colorXY);\n\n if (this.constructor.colorDiff(rgba1, rgba2) > tolerance) {\n // this pixel is too distant from the first one: abort this side scan\n break west;\n }\n }\n // this column contains all pixels with the same color: increment this side pixels to crop\n westPixelsToCrop++;\n }\n\n // decide if a crop is needed\n let doCrop = false;\n\n // apply leaveBorder\n westPixelsToCrop = westPixelsToCrop - leaveBorder;\n eastPixelsToCrop = eastPixelsToCrop - leaveBorder;\n northPixelsToCrop = northPixelsToCrop - leaveBorder;\n southPixelsToCrop = southPixelsToCrop - leaveBorder;\n\n if (cropSymmetric) {\n const horizontal = Math.min(eastPixelsToCrop, westPixelsToCrop);\n const vertical = Math.min(northPixelsToCrop, southPixelsToCrop);\n westPixelsToCrop = horizontal;\n eastPixelsToCrop = horizontal;\n northPixelsToCrop = vertical;\n southPixelsToCrop = vertical;\n }\n\n // safety checks\n const widthOfRemainingPixels =\n w - (westPixelsToCrop + eastPixelsToCrop);\n const heightOfRemainingPixels =\n h - (southPixelsToCrop + northPixelsToCrop);\n\n // make sure that crops are > 0\n westPixelsToCrop = westPixelsToCrop >= 0 ? westPixelsToCrop : 0;\n eastPixelsToCrop = eastPixelsToCrop >= 0 ? eastPixelsToCrop : 0;\n northPixelsToCrop = northPixelsToCrop >= 0 ? northPixelsToCrop : 0;\n southPixelsToCrop = southPixelsToCrop >= 0 ? southPixelsToCrop : 0;\n\n if (cropOnlyFrames) {\n // crop image if all sides should be cropped\n doCrop =\n eastPixelsToCrop !== 0 &&\n northPixelsToCrop !== 0 &&\n westPixelsToCrop !== 0 &&\n southPixelsToCrop !== 0;\n } else {\n // crop image if at least one side should be cropped\n doCrop =\n eastPixelsToCrop !== 0 ||\n northPixelsToCrop !== 0 ||\n westPixelsToCrop !== 0 ||\n southPixelsToCrop !== 0;\n }\n\n if (doCrop) {\n // do the real crop\n this.crop(\n eastPixelsToCrop,\n northPixelsToCrop,\n widthOfRemainingPixels,\n heightOfRemainingPixels\n );\n }\n\n if (isNodePattern(cb)) {\n cb.call(this, null, this);\n }\n\n return this;\n }\n }\n };\n}\n"],"file":"index.js"} |