在处理这些数据类型时,你需要了解 torch.Tensor 类。
完整文档请见这里,或者参考 Comfy 所需关键概念的介绍

如果你的节点有且只有一个输出且为张量,记得返回 (image,) 而不是 (image)

下方大部分概念都在示例代码片段中有说明。

图像(Images)

IMAGE 是一个形状为 [B,H,W,C]torch.Tensor,其中 C=3。如果你需要保存或加载图像,需要在 PIL.Image 格式和张量之间进行转换——请参见下方代码片段!注意,有些 pytorch 操作提供(或期望)[B,C,H,W],即“通道优先”,这样做是为了计算效率。请务必小心区分。

使用 PIL.Image

如果你想加载和保存图像,你需要用到 PIL:

from PIL import Image, ImageOps

蒙版(Masks)

MASK 是一个形状为 [B,H,W]torch.Tensor
在许多场景下,蒙版的值为二值(0 或 1),用于指示哪些像素需要进行特定操作。
有时蒙版的值会在 0 到 1 之间,用于表示遮罩的程度(例如调整透明度、滤镜或图层合成)。

Load Image 节点生成的蒙版

LoadImage 节点会使用图像的 alpha 通道(即“RGBA”中的“A”)来创建蒙版。
alpha 通道的值会被归一化到 [0,1](torch.float32),然后再取反。
LoadImage 节点在加载图像时总会生成一个 MASK 输出。许多图片(如 JPEG)没有 alpha 通道,这种情况下,LoadImage 会创建一个形状为 [1, 64, 64] 的默认蒙版。

理解蒙版的形状

numpyPIL 等库中,单通道图像(如蒙版)通常表示为二维数组,形状为 [H,W]
这意味着 C(通道)维度是隐式的,因此与 IMAGE 类型不同,蒙版的批量通常只有三维:[B, H, W]
有时你会遇到 B 维被隐式 squeeze 的蒙版,变成了 [H,W] 的张量。

在使用 MASK 时,你经常需要通过 unsqueeze 匹配形状,变成 [B,H,W,C],其中 C=1
要给 C 维 unsqueeze,请用 unsqueeze(-1),要给 B 维 unsqueeze,请用 unsqueeze(0)
如果你的节点接收 MASK 作为输入,建议总是检查 len(mask.shape)

潜变量(Latents)

LATENT 是一个 dict;潜变量样本通过键 samples 引用,形状为 [B,C,H,W],其中 C=4

LATENT 是通道优先,IMAGE 是通道最后