imagerot
Version:
A lightweight, cross-environment image library for applying unique effects via raw image buffers.
61 lines (60 loc) • 2.57 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.heatmap = void 0;
;
const defaultIntensity = 0.8;
const defaultControlPoints = [
{ stop: 0.0, color: { r: 0, g: 0, b: 255 } },
{ stop: 0.1, color: { r: 0, g: 255, b: 0 } },
{ stop: 0.3, color: { r: 255, g: 255, b: 0 } },
{ stop: 0.5, color: { r: 255, g: 165, b: 0 } },
{ stop: 0.7, color: { r: 255, g: 0, b: 0 } },
{ stop: 1.0, color: { r: 128, g: 0, b: 128 } }
];
const interpolateColor = (colors, t) => {
if (t <= 0)
return colors[0].color;
if (t >= 1)
return colors[colors.length - 1].color;
let i = 1;
for (; i < colors.length - 1; i++) {
if (t < colors[i].stop)
break;
}
const t0 = colors[i - 1].stop, t1 = colors[i].stop;
const ratio = (t - t0) / (t1 - t0);
return {
r: Math.round(colors[i - 1].color.r * (1 - ratio) + colors[i].color.r * ratio),
g: Math.round(colors[i - 1].color.g * (1 - ratio) + colors[i].color.g * ratio),
b: Math.round(colors[i - 1].color.b * (1 - ratio) + colors[i].color.b * ratio),
a: 255
};
};
const global = (_a, ...args_1) => __awaiter(void 0, [_a, ...args_1], void 0, function* ({ data, width, height }, options = null) {
const { intensity = defaultIntensity, controlPoints = defaultControlPoints } = (options || {});
const dataLength = width * height * 4;
for (let i = 0; i < dataLength; i += 4) {
const pixelIntensity = (data[i] + data[i + 1] + data[i + 2]) / (3 * 255);
const color = interpolateColor(controlPoints, pixelIntensity * intensity);
data[i] = color.r;
data[i + 1] = color.g;
data[i + 2] = color.b;
data[i + 3] = color.a || data[i + 3];
}
return data;
});
const heatmap = {
name: 'heatmap',
browser: global,
node: global
};
exports.heatmap = heatmap;