replace-color-ts
Version:
Replace color with another one pixel by pixel.
87 lines (86 loc) • 4.24 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Jimp = __importStar(require("jimp"));
const convert_color_1 = __importDefault(require("./utils/convert-color"));
const get_delta_1 = __importDefault(require("./utils/get-delta"));
const is_number_1 = __importDefault(require("./utils/is-number"));
const replace_color_error_1 = __importDefault(require("./utils/replace-color-error"));
const validate_colors_1 = __importDefault(require("./utils/validate-colors"));
const replaceColor = ({ image, colors, formula = "E00", deltaE = 2.3 }, callback) => {
if (callback) {
if (typeof callback !== "function") {
throw new replace_color_error_1.default("PARAMETER_INVALID", "callback");
}
}
return new Promise((resolve, reject) => {
callback =
callback ||
((err, jimpObject) => {
if (err)
return reject(err);
return resolve(jimpObject);
});
if (!image) {
return callback(new replace_color_error_1.default("PARAMETER_REQUIRED", "options.image"));
}
const colorsValidationError = (0, validate_colors_1.default)(colors);
if (colorsValidationError) {
return callback(new replace_color_error_1.default(colorsValidationError.code, colorsValidationError.field));
}
if (!(typeof formula === "string" && ["E76", "E94", "E00"].includes(formula))) {
return callback(new replace_color_error_1.default("PARAMETER_INVALID", "options.formula"));
}
if (!((0, is_number_1.default)(deltaE) && deltaE >= 0 && deltaE <= 100)) {
return callback(new replace_color_error_1.default("PARAMETER_INVALID", "options.deltaE"));
}
Jimp.read(image)
.then((jimpObject) => {
const targetLABColor = (0, convert_color_1.default)(colors.type, "lab", colors.targetColor);
const replaceRGBColor = (0, convert_color_1.default)(colors.type, "rgb", colors.replaceColor);
jimpObject.scan(0, 0, jimpObject.bitmap.width, jimpObject.bitmap.height, (x, y, idx) => {
const currentLABColor = (0, convert_color_1.default)("rgb", "lab", [
jimpObject.bitmap.data[idx],
jimpObject.bitmap.data[idx + 1],
jimpObject.bitmap.data[idx + 2],
]);
if ((0, get_delta_1.default)(currentLABColor, targetLABColor, formula) <= deltaE) {
jimpObject.bitmap.data[idx] = replaceRGBColor[0];
jimpObject.bitmap.data[idx + 1] = replaceRGBColor[1];
jimpObject.bitmap.data[idx + 2] = replaceRGBColor[2];
if (replaceRGBColor[3] !== null)
jimpObject.bitmap.data[idx + 3] = replaceRGBColor[3];
}
});
if (callback)
callback(null, jimpObject);
})
.catch(callback);
});
};
exports.default = replaceColor;