Files
CavinHuang-comfyui-nodes-docs/docs/ImageBlend.md
2024-05-15 08:09:49 +08:00

3.4 KiB

Documentation

Blend节点旨在使用指定的混合因子和混合模式将两张图像无缝地结合在一起,从而产生视觉上连贯的输出。它调整不透明度并应用各种混合技术以实现所需的美学效果。

Input types

Required

  • image1
    • image1是将与第二张图像混合的第一张输入图像。它在确定最终混合图像的外观中起着至关重要的作用。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • image2
    • image2是将与第一张图像混合的第二张输入图像。它对最终图像的贡献受混合因子和混合模式的影响。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor
  • blend_factor
    • 混合因子决定了第二张图像与第一张图像混合的程度。这是一个关键参数,用于控制两张图像之间的平衡。
    • Comfy dtype: FLOAT
    • Python dtype: float
  • blend_mode
    • 混合模式决定了用于混合图像的算法。它显著影响混合操作的最终视觉效果。
    • Comfy dtype: COMBO['normal', 'multiply', 'screen', 'overlay', 'soft_light', 'difference']
    • Python dtype: str

Output types

  • blended_image
    • 混合后的图像是blend_images函数的输出,代表了两张输入图像在应用了混合因子和混合模式后的组合结果。
    • Comfy dtype: IMAGE
    • Python dtype: torch.Tensor

Usage tips

  • Infra type: CPU

Source code

class Blend:

    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(s):
        return {'required': {'image1': ('IMAGE',), 'image2': ('IMAGE',), 'blend_factor': ('FLOAT', {'default': 0.5, 'min': 0.0, 'max': 1.0, 'step': 0.01}), 'blend_mode': (['normal', 'multiply', 'screen', 'overlay', 'soft_light', 'difference'],)}}
    RETURN_TYPES = ('IMAGE',)
    FUNCTION = 'blend_images'
    CATEGORY = 'image/postprocessing'

    def blend_images(self, image1: torch.Tensor, image2: torch.Tensor, blend_factor: float, blend_mode: str):
        image2 = image2.to(image1.device)
        if image1.shape != image2.shape:
            image2 = image2.permute(0, 3, 1, 2)
            image2 = comfy.utils.common_upscale(image2, image1.shape[2], image1.shape[1], upscale_method='bicubic', crop='center')
            image2 = image2.permute(0, 2, 3, 1)
        blended_image = self.blend_mode(image1, image2, blend_mode)
        blended_image = image1 * (1 - blend_factor) + blended_image * blend_factor
        blended_image = torch.clamp(blended_image, 0, 1)
        return (blended_image,)

    def blend_mode(self, img1, img2, mode):
        if mode == 'normal':
            return img2
        elif mode == 'multiply':
            return img1 * img2
        elif mode == 'screen':
            return 1 - (1 - img1) * (1 - img2)
        elif mode == 'overlay':
            return torch.where(img1 <= 0.5, 2 * img1 * img2, 1 - 2 * (1 - img1) * (1 - img2))
        elif mode == 'soft_light':
            return torch.where(img2 <= 0.5, img1 - (1 - 2 * img2) * img1 * (1 - img1), img1 + (2 * img2 - 1) * (self.g(img1) - img1))
        elif mode == 'difference':
            return img1 - img2
        else:
            raise ValueError(f'Unsupported blend mode: {mode}')

    def g(self, x):
        return torch.where(x <= 0.25, ((16 * x - 12) * x + 4) * x, torch.sqrt(x))