image-js
Version:
Image processing and manipulation in JavaScript
71 lines (69 loc) • 2.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = hsl;
var _Image = _interopRequireDefault(require("../Image"));
var _model = require("../model/model");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// http://www.easyrgb.com/index.php?X=MATH&H=18#text18
// check rgbToHsl : https://bgrins.github.io/TinyColor/docs/tinycolor.html
/**
* Make a copy of the current image and convert the color model to HSL
* The source image has to be RGB !
* @memberof Image
* @instance
* @return {Image} - New image in HSL color model
* @example
* var hslImage = image.hsl();
* // we can create one image per channel
* var channels = hslImage.split();
*/
function hsl() {
this.checkProcessable('hsl', {
bitDepth: [8, 16],
alpha: [0, 1],
colorModel: [_model.RGB]
});
let newImage = _Image.default.createFrom(this, {
colorModel: _model.HSL
});
let threshold = Math.floor(this.maxValue / 2);
let ptr = 0;
let data = this.data;
for (let i = 0; i < data.length; i += this.channels) {
let red = data[i];
let green = data[i + 1];
let blue = data[i + 2];
let max = Math.max(red, green, blue);
let min = Math.min(red, green, blue);
let hue = 0;
let saturation = 0;
let luminance = (max + min) / 2;
if (max !== min) {
let delta = max - min;
saturation = luminance > threshold ? delta / (2 - max - min) : delta / (max + min);
switch (max) {
case red:
hue = (green - blue) / delta + (green < blue ? 6 : 0);
break;
case green:
hue = (blue - red) / delta + 2;
break;
case blue:
hue = (red - green) / delta + 4;
break;
default:
throw new Error('unreachable');
}
hue /= 6;
}
newImage.data[ptr++] = hue * this.maxValue;
newImage.data[ptr++] = saturation * this.maxValue;
newImage.data[ptr++] = luminance;
if (this.alpha) {
newImage.data[ptr++] = data[i + 3];
}
}
return newImage;
}