UNPKG

voluptasquisquam

Version:

Image processing and manipulation in JavaScript

97 lines (91 loc) 3.64 kB
export const methods = { luma709(data, i) { // sRGB // return data[i] * 0.2126 + data[i + 1] * 0.7152 + data[i + 2] * 0.0722; // Let's do a little trick ... in order not convert the integer to a double we do // the multiplication with integer to reach a total of 32768 and then shift the bits // of 15 to the right // This does a Math.floor and may lead to small (max 1) difference // Same result, > 10% faster on the full grey conversion return (data[i] * 6966 + data[i + 1] * 23436 + data[i + 2] * 2366) >> 15; }, luma601(data, i) { // NTSC // return this.data[i] * 0.299 + data[i + 1] * 0.587 + data[i + 2] * 0.114; return (data[i] * 9798 + data[i + 1] * 19235 + data[i + 2] * 3735) >> 15; }, maximum(data, i) { return Math.max(data[i], data[i + 1], data[i + 2]); }, minimum(data, i) { return Math.min(data[i], data[i + 1], data[i + 2]); }, average(data, i) { return ((data[i] + data[i + 1] + data[i + 2]) / 3) >> 0; }, minmax(data, i) { return (Math.max(data[i], data[i + 1], data[i + 2]) + Math.min(data[i], data[i + 1], data[i + 2])) / 2; }, red(data, i) { return data[i]; }, green(data, i) { return data[i + 1]; }, blue(data, i) { return data[i + 2]; }, cyan(data, i, image) { let black = methods.black(data, i, image); return (image.maxValue - data[0] - black) / (1 - black / image.maxValue) >> 0; }, magenta(data, i, image) { let black = methods.black(data, i, image); return (image.maxValue - data[1] - black) / (1 - black / image.maxValue) >> 0; }, yellow(data, i, image) { let black = methods.black(data, i, image); return (image.maxValue - data[2] - black) / (1 - black / image.maxValue) >> 0; }, black(data, i, image) { return Math.min(image.maxValue - data[i], image.maxValue - data[i + 1], image.maxValue - data[i + 2]); }, hue(data, i, image) { let min = methods.min(data, i); let max = methods.max(data, i); if (max === min) { return 0; } let hue = 0; let delta = max - min; switch (max) { case data[i]: hue = (data[i + 1] - data[i + 2]) / delta + (data[i + 1] < data[i + 2] ? 6 : 0); break; case data[i + 1]: hue = (data[i + 2] - data[i]) / delta + 2; break; case data[i + 2]: hue = (data[i] - data[i + 1]) / delta + 4; break; default: throw new Error('unreachable'); } return (hue / 6 * image.maxValue) >> 0; }, saturation(data, i, image) { // from HSV model let min = methods.min(data, i); let max = methods.max(data, i); let delta = max - min; return (max === 0) ? 0 : delta / max * image.maxValue; }, lightness(data, i) { let min = methods.min(data, i); let max = methods.max(data, i); return (max + min) / 2; } }; Object.defineProperty(methods, 'luminosity', {enumerable: false, value: methods.lightness}); Object.defineProperty(methods, 'luminance', {enumerable: false, value: methods.lightness}); Object.defineProperty(methods, 'min', {enumerable: false, value: methods.minimum}); Object.defineProperty(methods, 'max', {enumerable: false, value: methods.maximum}); Object.defineProperty(methods, 'brightness', {enumerable: false, value: methods.maximum}); export const names = Object.keys(methods);