Files

45 lines
1.4 KiB
JavaScript

export function maskChannelFromNode(sourceNode) {
const className = `${sourceNode?.comfyClass || ""} ${sourceNode?.type || ""}`;
if (/LoadImageMask/i.test(className)) {
const channelWidget = sourceNode.widgets?.find(
(widget) => widget.name?.toLowerCase() === "channel",
);
const channel = String(channelWidget?.value || "alpha").toLowerCase();
if (["red", "green", "blue"].includes(channel)) return channel;
}
return "alpha";
}
export function computeMaskBBox(pixelData, width, height, channel = "alpha") {
const channelIndex = { red: 0, green: 1, blue: 2, alpha: 3 }[channel] ?? 3;
let minX = width;
let minY = height;
let maxX = -1;
let maxY = -1;
for (let y = 0; y < height; y += 1) {
for (let x = 0; x < width; x += 1) {
const value = pixelData[(y * width + x) * 4 + channelIndex] / 255;
// ComfyUI LoadImage returns 1 - alpha for MASK. LoadImageMask returns
// raw RGB values for its color-channel modes.
const maskValue = channel === "alpha" ? 1 - value : value;
if (maskValue <= 0.5) continue;
minX = Math.min(minX, x);
minY = Math.min(minY, y);
maxX = Math.max(maxX, x);
maxY = Math.max(maxY, y);
}
}
if (maxX < minX || maxY < minY) {
return { x: 0, y: 0, width, height, empty: true };
}
return {
x: minX,
y: minY,
width: maxX - minX + 1,
height: maxY - minY + 1,
empty: false,
};
}