refactor: Move validation logic to core

This commit is contained in:
Lokesh Dhakar
2019-07-21 22:58:43 -07:00
parent e9b323a6b2
commit 8236c9d71f
13 changed files with 74 additions and 31 deletions

View File

@@ -28,13 +28,18 @@ function getColor(img, quality) {
}
function getPalette(img, colorCount = 10, quality = 10) {
const options = core.validateOptions({
colorCount,
quality
});
return new Promise((resolve, reject) => {
loadImg(img)
.then(imgData => {
const pixelCount = imgData.shape[0] * imgData.shape[1];
const pixelArray = core.createPixelArray(imgData.data, pixelCount, quality);
const pixelArray = core.createPixelArray(imgData.data, pixelCount, options.quality);
const cmap = quantize(pixelArray, colorCount);
const cmap = quantize(pixelArray, options.colorCount);
const palette = cmap? cmap.palette() : null;
resolve(palette);

View File

@@ -31,17 +31,11 @@ import core from './core.js';
var CanvasImage = function (image) {
this.canvas = document.createElement('canvas');
this.context = this.canvas.getContext('2d');
this.width = this.canvas.width = image.width;
this.height = this.canvas.height = image.height;
this.context.drawImage(image, 0, 0, this.width, this.height);
};
CanvasImage.prototype.getPixelCount = function () {
return this.width * this.height;
};
CanvasImage.prototype.getImageData = function () {
return this.context.getImageData(0, 0, this.width, this.height);
};
@@ -86,25 +80,22 @@ ColorThief.prototype.getColor = function(sourceImage, quality = 10) {
*
*/
ColorThief.prototype.getPalette = function(sourceImage, colorCount, quality) {
if (typeof colorCount === 'undefined' || colorCount < 2 || colorCount > 256) {
colorCount = 10;
}
if (typeof quality === 'undefined' || quality < 1) {
quality = 10;
}
const options = core.validateOptions({
colorCount,
quality
});
// Create custom CanvasImage object
var image = new CanvasImage(sourceImage);
var imageData = image.getImageData();
var pixels = imageData.data;
var pixelCount = image.getPixelCount();
var pixelCount = image.width * image.height;
const pixelArray = core.createPixelArray(imageData, pixelCount, quality);
const pixelArray = core.createPixelArray(imageData.data, pixelCount, options.quality);
// Send array to quantize function which clusters values
// using median cut algorithm
var cmap = quantize(pixelArray, colorCount);
var cmap = quantize(pixelArray, options.colorCount);
var palette = cmap? cmap.palette() : null;
return palette;

View File

@@ -19,6 +19,31 @@ function createPixelArray(imgData, pixelCount, quality) {
return pixelArray;
}
function validateOptions(options) {
let { colorCount, quality } = options;
if (typeof colorCount === 'undefined' || !Number.isInteger(colorCount)) {
colorCount = 10;
} else if (colorCount === 1 ) {
throw new Error('colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()');
} else {
colorCount = Math.max(colorCount, 2);
colorCount = Math.min(colorCount, 20);
}
if (typeof quality === 'undefined' || Number.isInteger(quality)) {
quality = 10;
} else if (quality < 1) {
quality = 10;
}
return {
colorCount,
quality
}
}
module.exports = {
createPixelArray
createPixelArray,
validateOptions
};

View File

@@ -19,6 +19,31 @@ function createPixelArray(imgData, pixelCount, quality) {
return pixelArray;
}
function validateOptions(options) {
let { colorCount, quality } = options;
if (typeof colorCount === 'undefined' || !Number.isInteger(colorCount)) {
colorCount = 10;
} else if (colorCount === 1 ) {
throw new Error('colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()');
} else {
colorCount = Math.max(colorCount, 2);
colorCount = Math.min(colorCount, 20);
}
if (typeof quality === 'undefined' || Number.isInteger(quality)) {
quality = 10;
} else if (quality < 1) {
quality = 10;
}
return {
colorCount,
quality
}
}
export default {
createPixelArray,
}
validateOptions
};