45 lines
1.4 KiB
JavaScript
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,
|
|
};
|
|
}
|