UNPKG

extract-colors

Version:

Extract color palettes from images

1 lines 9.35 kB
{"version":3,"file":"worker-wrapper.mjs","sources":["../src/extract/cleanInputs.ts","../src/workerWrapper.ts"],"sourcesContent":["import { BrowserOptions, OptionsCleaned } from \"../types/Options\";\n\n/**\n * Default extractor values\n */\nexport const EXTRACTOR_PIXELS_DEFAULT = 64000;\nexport const EXTRACTOR_DISTANCE_DEFAULT = 0.22;\n\n/**\n * Default average values\n */\nexport const AVERAGE_HUE_DEFAULT = 1 / 12;\nexport const AVERAGE_SATURATION_DEFAULT = 1 / 5;\nexport const AVERAGE_LIGHTNESS_DEFAULT = 1 / 5;\n\nexport function testInputs({\n pixels = EXTRACTOR_PIXELS_DEFAULT,\n distance = EXTRACTOR_DISTANCE_DEFAULT,\n colorValidator = (\n _red: number,\n _green: number,\n _blue: number,\n _alpha?: number\n ) => (_alpha ?? 255) > 250,\n hueDistance = AVERAGE_HUE_DEFAULT,\n saturationDistance = AVERAGE_LIGHTNESS_DEFAULT,\n lightnessDistance = AVERAGE_SATURATION_DEFAULT,\n crossOrigin = \"\",\n requestMode = \"cors\",\n}: BrowserOptions = {}) {\n /**\n * Test if value is an integer.\n */\n const testUint = (\n label: string,\n val: number,\n min = 0,\n max = Number.MAX_SAFE_INTEGER\n ) => {\n if (!Number.isInteger(val)) {\n throw new Error(`${label} is not a valid number (${val})`);\n }\n\n if (val < min) {\n console.warn(`${label} can not be less than ${min} (it's ${val})`);\n }\n\n if (val > max) {\n console.warn(`${label} can not be more than ${max} (it's ${val})`);\n }\n\n return Math.min(Math.max(val, min), max);\n };\n\n /**\n * Test if value is a number.\n */\n const testNumber = (\n label: string,\n val: number,\n min = 0,\n max = Number.MAX_VALUE\n ) => {\n if (Number(val) !== val) {\n throw new Error(`${label} is not a valid number (${val})`);\n }\n\n if (val < min) {\n console.warn(`${label} can not be less than ${min} (it's ${val})`);\n }\n\n if (val > max) {\n console.warn(`${label} can not be more than ${max} (it's ${val})`);\n }\n\n return Math.min(Math.max(val, min), max);\n };\n\n /**\n * Test if value is a function.\n */\n const testFunction = <T = () => void>(label: string, val: T) => {\n if (!val || {}.toString.call(val) !== \"[object Function]\") {\n throw new Error(`${label} is not a function (${val})`);\n }\n\n return val;\n };\n\n /**\n * Test if value is in the list of values\n */\n const testValueInList = <T>(label: string, val: T, list: T[]) => {\n if (list.indexOf(val) < 0) {\n console.warn(\n `${label} can be one of this values ${list\n .map((v) => `\"${v}\"`)\n .join(\", \")} (it's \"${val}\")`\n );\n }\n };\n\n testUint(\"pixels\", pixels || 0, 1);\n testNumber(\"distance\", distance, 0, 1);\n testFunction(\"colorValidator\", colorValidator);\n testNumber(\"hueDistance\", hueDistance, 0, 1);\n testNumber(\"saturationDistance\", saturationDistance, 0, 1);\n testNumber(\"lightnessDistance\", lightnessDistance, 0, 1);\n testValueInList(\"crossOrigin\", crossOrigin, [\n \"\",\n \"anonymous\",\n \"use-credentials\",\n ]);\n testValueInList(\"requestMode\", requestMode, [\n \"cors\",\n \"navigate\",\n \"no-cors\",\n \"same-origin\",\n ]);\n}\n\nexport default ({\n pixels = EXTRACTOR_PIXELS_DEFAULT,\n distance = EXTRACTOR_DISTANCE_DEFAULT,\n colorValidator = (\n _red: number,\n _green: number,\n _blue: number,\n _alpha?: number\n ) => (_alpha ?? 255) > 250,\n hueDistance = AVERAGE_HUE_DEFAULT,\n saturationDistance = AVERAGE_LIGHTNESS_DEFAULT,\n lightnessDistance = AVERAGE_SATURATION_DEFAULT,\n crossOrigin = \"\",\n requestMode = \"cors\",\n}: BrowserOptions = {}): OptionsCleaned => {\n return [\n Math.max(pixels, 1),\n Math.min(Math.max(distance, 0), 1),\n colorValidator,\n Math.min(Math.max(hueDistance, 0), 1),\n Math.min(Math.max(saturationDistance, 0), 1),\n Math.min(Math.max(lightnessDistance, 0), 1),\n crossOrigin,\n requestMode,\n ];\n};\n","import WorkerWrapper from \"./worker?worker&inline\";\nimport cleanInputs, { testInputs } from \"./extract/cleanInputs\";\nimport type { BrowserOptions, ImageDataAlt } from \"./types/Options\";\nimport type { FinalColor } from \"./types/Color\";\n\n/**\n * Extract colors from a picture with Web Worker support.\n *\n * @param picture image source or image data\n * @param options Process configuration\n * @param options.pixels Total pixel number of the resized picture for calculation\n * @param options.distance From 0 to 1 is the color distance to not have near colors (1 distance is between white and black)\n * @param options.colorValidator Test function to enable only some colors\n * @param options.saturationDistance Minimum saturation value between two colors otherwise the colors will be merged (from 0 to 1)\n * @param options.lightnessDistance inimum lightness value between two colors otherwise the colors will be merged (from 0 to 1)\n * @param options.hueDistance inimum hue value between two colors otherwise the colors will be merged (from 0 to 1)\n * @param options.requestMode support for CORS (only for Web Workers in browser)\n *\n * @returns List of extracted colors\n */\nexport const extractColors = (\n picture: string | ImageData | ImageDataAlt,\n options?: BrowserOptions\n) => {\n if (__DEV__) {\n testInputs(options);\n }\n\n if (picture instanceof HTMLImageElement) {\n if (__DEV__) {\n console.warn(\n \"HTMLImageElement not enable on worker, please send 'src' or image data instead HTMLImageElement\"\n );\n }\n\n // HTMLImageElement not enable on Worker, switch to src fallback\n picture = picture.src;\n }\n\n const [_pixels, _distance, _colorValidator, ..._cleanInputsRest] =\n cleanInputs(options);\n\n // Wrap worker inside Promise\n return new Promise<FinalColor[]>((resolve, reject) => {\n try {\n const worker: Worker = new WorkerWrapper();\n worker.postMessage([\n picture,\n [_pixels, _distance, _colorValidator.toString(), ..._cleanInputsRest],\n ]);\n worker.addEventListener(\"message\", (message) => {\n resolve(message.data);\n worker.terminate();\n });\n worker.addEventListener(\"error\", (error) => {\n reject(error);\n worker.terminate();\n });\n } catch (error) {\n reject(error);\n }\n });\n};\n"],"names":[],"mappings":"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"}