Files
CavinHuang-comfyui-nodes-docs/docs/SaltRGBAFromMask.md
2024-07-04 08:39:03 +08:00

2.9 KiB

Documentation

  • Class name: SaltRGBAFromMask
  • Category: SALT/Image/Composite
  • Output node: False

该节点旨在将遮罩转换为RGBA图像,为结果图像添加透明度。它主要处理图像遮罩以生成具有alpha通道的图像,从而基于输入遮罩创建某些区域透明的图像。

Input types

Required

  • image
    • 源图像,将与遮罩结合生成RGBA图像。图像的非遮罩区域将保持可见,而遮罩区域可以变为透明或半透明。
    • Comfy dtype: IMAGE
    • Python dtype: PIL.Image
  • mask
    • 用于生成RGBA图像的输入遮罩。该遮罩决定了结果图像中哪些区域将是透明或不透明的。
    • Comfy dtype: MASK
    • Python dtype: PIL.Image
  • threshold
    • 用于确定遮罩中被视为透明的临界点。遮罩中高于此值的像素将更不透明。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • invert_mask
    • 布尔值,指示是否在将遮罩应用于图像之前对其进行反转。反转遮罩会交换被视为透明和不透明的区域。
    • Comfy dtype: BOOLEAN
    • Python dtype: bool

Output types

  • rgba_image
    • 应用输入遮罩定义透明区域后得到的RGBA图像。
    • Comfy dtype: IMAGE
    • Python dtype: PIL.Image

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class SaltRGBAFromMask:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "image": ("IMAGE",),
                "mask": ("MASK",),
                "threshold": ("FLOAT", {"min": 0, "max": 1.0, "step": 0.01, "default": 0.5}),
                "invert_mask": ("BOOLEAN", {"default": False})
            }
        }
    
    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("rgba_image",)

    FUNCTION = "composite"
    CATEGORY = "SALT/Image/Composite"

    def composite(self, image, mask, threshold, invert_mask):
        img = tensor2pil(image)
        msk = mask2pil(mask)

        msk = msk.convert("L")
        img = img.convert("RGBA")

        img_ratio = img.size[0] / img.size[1]
        msk_ratio = msk.size[0] / msk.size[1]

        if img_ratio > msk_ratio:
            scale_factor = img.size[1] / msk.size[1]
            new_size = (int(msk.size[0] * scale_factor), img.size[1])
        else:
            scale_factor = img.size[0] / msk.size[0]
            new_size = (img.size[0], int(msk.size[1] * scale_factor))

        msk = msk.resize(new_size, Image.Resampling.BILINEAR)

        pad_mask = Image.new("L", img.size, 0)

        x = (img.size[0] - msk.size[0]) // 2
        y = (img.size[1] - msk.size[1]) // 2
        pad_mask.paste(msk, (x, y))

        thresh = int(threshold * 255)
        pad_mask = pad_mask.point(lambda p: 255 if p > thresh else 0)

        if invert_mask:
            pad_mask = ImageOps.invert(pad_mask)

        rgba_image = Image.new("RGBA", img.size, (0, 0, 0, 0))
        rgba_image.paste(img, (0, 0), pad_mask)

        return (pil2tensor(rgba_image),)